ページ 11

実験作の評価のお願い

Posted: 2010年8月21日(土) 16:47
by ナムアニクラウド
こんにちは、ナムアニクラウドです。
只今C++にて、DXライブラリをラップしたモジュールを制作しています。
  (モジュールとは、プログラムを組み立てる部品となるクラス群・関数群です)
「誰でも使いやすいモジュール」を目指してクラスを構築し、
実際にそれを用いてゲームを制作しています。

今回はちょっと変わった機能ができたので、
リファレンスマニュアルのテストがてら紹介しようと思った次第です。
ダウンロードはこちらから。
    http://ux.getuploader.com/NAC_develop/d ... oup0.1.zip

主にリファレンスが見やすく出来たかどうかの評価をしてもらいたいと思っています。
よろしくお願いします。
肝心のモジュールの方は、本当のところ、
ちょっと面白い機能が出来たので誰かに遊んでほしいな、と思って紹介しています。
DXライブラリのラップでもありません。

モジュールの内容は、ある状況下での条件文の簡略化です。
使い方はreadmeに簡単に書いてあります。
リファレンスにはサンプルプログラムもありますので、ご覧ください。

Re:実験作の評価のお願い

Posted: 2010年8月21日(土) 20:43
by h2so5
パスワードがわからないのですが...^^;

私もC++でDxLibのラッパー作っているので(Modelクラス作ったりとか)興味はあります。

Re:実験作の評価のお願い

Posted: 2010年8月21日(土) 20:58
by ナムアニクラウド
h2so5さん
>>パスワードがわからないのですが...^^;

ご報告ありがとうございます!
ものすごいドジ踏んじゃって私ったら。

パスワードは「nac」です。カギカッコは含みません。
では、改めてよろしくお願いします。

Re:実験作の評価のお願い

Posted: 2010年8月21日(土) 21:40
by dic
>ナムアニクラウドさん
はじめまして
STLを使われているようで、STLの標準ライブラリ find_if() とはどう違ったアプローチができるのでしょうか?

Re:実験作の評価のお願い

Posted: 2010年8月21日(土) 22:59
by palladium
>例えば、ひとつの整数変数n に対して、
0,1,2,4,8のいずれかと等しいかを得るとき、
  if( n == 0 || n == 1 || n == 2 || n == 4 || n == 8 )
としますが、...

と、ありますが

if(0 + 1 + 2 + 4 + 8 & n || n == 0)
これでもいけるようです。

Re:実験作の評価のお願い

Posted: 2010年8月22日(日) 00:11
by ナムアニクラウド
>dicさん

dicさん初めまして。
実は find_if関数 っていうのは今回初めて聞いたもので・・・
早速ググって、試してみたところ、コンテナと比較関数が必要な関数らしいですね。

比較グループを使った場合の利点をあえて挙げるなら、
コンテナ、イテレータと比較関数が不要であることでしょうか。
コンテナの中身を比較したい、って言う時はfind_ifが断然いいと思います。
他には bool型を返すのでfind_ifが返すイテレータが要らないときに楽だとか。(ifに直接書ける)

しかしまあ、そもそも、新しい構文を作るような変な演算子オーバーロードはあまり使いやすくないものですから、
実用目的としては結構厳しいです。
「1対多の、コンテナを含まない比較」でしか活躍しないですし。

よく考えると思ったより気の利かない機構かもしれないですね。
そんなモジュールでしたが、見てくれてありがとうございました!

>palladium

palladiumさん初めまして。

なるほど、そういう比較の方法もありますね。
しかし、その方法は値が2の階乗である時に使える方法です。
リファレンスに書いたものはあくまで「例」で、
「もし比較グループを使ったら」というニュアンスのものです。

ちょっと誤解を招いてしまったようですが、
リファレンスに書いた使用例が紛らわしかったようですね。
失礼いたしました。

Re:実験作の評価のお願い

Posted: 2010年8月22日(日) 02:06
by Justy
 ざっと見た感じドキュメントの方は内容的には特に問題ないと思います。
 サンプルが載っているので使い方はすぐにわかるでしょうし。

 強いて言えばドキュメントのバージョン、修正履歴の項目はあってもいいのかもしれません。


 ただブラウザの表示絡みでは何点かあります。

・ IE8 互換モード
 IE8で開くと互換モードなり #sideやサンプルプログラムあたりが正しく表示できませんでした。
 IE6, 7でも微妙に異なりますが、正しく表示できないようです(さすがにこちらは
レガシーなブラウザなのでサポートしなくてもいいとは思いますが)。


・ 文字コード
 htmlに文字コード指定は入れておいて下さい。
 一部のブラウザではこのままだと文字化けを起こす可能性があります。

Re:実験作の評価のお願い

Posted: 2010年8月22日(日) 07:02
by palladium
速度の比較の為、以下のコードを試してみました。
3パターンありますが
私の環境ではDebug, Release共にswitch文が1番速いようです。

/*
    Windows XP sp3
    Visual Studio 2005 sp2
    Pentium4  2.26GHz
*/

#include <windows.h>
#include <iostream>
#include "Group.h"
using namespace std;

int main()
{
    LARGE_INTEGER Freq, Before, After;
    DWORD Time = 0;
    QueryPerformanceFrequency(&Freq);
    QueryPerformanceCounter(&Before);

    int n = 8;
    int i = 100000;

    while (i--)
    {
        if (n == (group::cluster, 0, 1, 2, 4, 8)){         
            ;
        }

        /*if( n == 0 || n == 1 || n == 2 || n == 4 || n == 8 ){ 
            ;
        }*/

        /*switch(n){                                              
            case 0: 
            case 1: 
            case 2: 
            case 4: 
            case 8: break;
            default: break;
        }*/
    }

    QueryPerformanceCounter(&After);
    Time = (DWORD)((After.QuadPart - Before.QuadPart) * 1000 / Freq.QuadPart);
    
    cout << Time << endl;

    cin.ignore();
    return 0;
}

Re:実験作の評価のお願い

Posted: 2010年8月22日(日) 14:41
by ナムアニクラウド
>Justyさん

評価ありがとうございます。
ドキュメントの内容は問題ないようでよかったです。
文字エンコードについては、CSSに宣言を追加する方法を調べました。

IE8については、その仕様がCSSの正しい表記に近いらしく、記述が曖昧などの原因で崩れてしまうようです。
綺麗に表示できるよう、現在改良中です。


>palladiumさん

計測ありがとうございます。
自分は速度のことはすっかり忘れてました・・・

ソースコードを拝借してこちらでも計測してみました。
Windows Vista sp2
Visual Studio 2010 Express
Intel Core2 Duo CPU 2.67GHz  にて、
10万回の条件判定を行ないました。

 Groupモジュール
   Debug: 32秒344
   Release: 2秒551
 if文
   Debug:  0秒000
   Release: 0秒000
 switch文
   Debug:  0秒000
   Release: 0秒000

でした。かなり遅いです。
というのも内部でif文を使っているので、if文の数倍の時間がかかるのは当然ですね。
と言っても…数倍ってレベルではありませんが。

とてもいい経験になりました。今後のプログラミングに役立てたいと思います。
ありがとうございました。

Re:実験作の評価のお願い

Posted: 2010年8月22日(日) 15:41
by Justy
>かなり遅いです
 残念ですけどこのソースでは正しく評価できないかと。
 まともに評価できているのは Groupモジュールだけです。

 MSVCではこの if方式と switch方式はデバッグビルドであっても最適化され、
ただの“何もしない”ループなコードが生成されます。

 リリースビルドではそのループすら“無かった”コードが生成されますので更に高速になります。

 じゃどうすればいいかというと、ifが成立したとき、或いは成立しなかったときに何か
処理を入れれば最適化による処理の省略は防げます。

 こんなかんじとか。
[color=#d0d0ff" face="monospace]
if (n == (group::cluster, 0, 1, 2, 4, 8)){
++n;
}

if( n == 0 || n == 1 || n == 2 || n == 4 || n == 8 ){
++n;
}
[/color]


>if文の数倍の時間がかかるのは当然ですね
 勿論計測しないと正しくは判りませんが、 if文というよりコピーコンストラクタ・デストラクタが
走りすぎなところじゃないでしょうか。

 そのテストコードですと、5つの Groupクラスの一時オブジェクトが if分の中で生成され
if文を抜けると破棄されます。
 デバッグビルド時だと加えて operator,()のローカル変数の破棄と戻り値の分のオブジェクトの生成が
行われます。

 オブジェクトの生成・破棄時には内部のリストもコピー・破棄を繰り返すことになり、
その際メモリアロケートの処理も走りますのでその分遅くなっていると思います。


# まぁ、この辺りを改善したとしても ifや switchに勝つのは難しいとは思いますが……。

Re:実験作の評価のお願い

Posted: 2010年8月22日(日) 16:06
by palladium
> MSVCではこの if方式と switch方式はデバッグビルドであっても最適化され、
ただの“何もしない”ループなコードが生成されます。

存じております。

それゆえあえて計測テンプレートコードには測定時間を書き込みませんでした。

あまりに単純な式でも省略される場合もあります。
計算結果を出力するようなコードが必要かと思われます。

Re:実験作の評価のお願い

Posted: 2010年8月22日(日) 16:29
by Justy
 なるほど。そういうことでしたか。
 失礼しました。

 まぁナムアニクラウドさん向けの話ということで。

Re:実験作の評価のお願い

Posted: 2010年8月22日(日) 22:05
by ナムアニクラウド
>Justyさん

 >MSVCではこの if方式と switch方式はデバッグビルドであっても最適化され~
ご指摘ありがとうございます。
最適化の時に何もしないif文、switch文は消滅する可能性がある、という話ですね。
すっかり抜け落ちてました。どうりで測定した時間が0秒000になる訳ですね。

 >if文というよりコピーコンストラクタ・デストラクタが走りすぎなところじゃないでしょうか。
確かに毎ループ5個文のコンストラクタ・コピーコンストラクタを呼び出せば遅いですね。
内部の配列(今はlist)と登録方法を見直せば少しはマシになるかも知れない…

ちなみに、念のために条件が真の時に
  cout << "a" << endl;
を実行するようにしたソースの時間も計ってあります。

 Groupモジュール
   Debug: 40秒487
   Release:13秒702
 if文
   Debug: 9秒983
   Release:9秒653
 switch文
   Debug: 9秒817
   Release:9秒515

ところで、時間計測って、入出力のような処理よりも速い、
それこそ10万回の実行でかかる時間がになる0ような処理がいいのかもとか、あとで考えてました。
前置インクリメントは速そうな感じがしますが、どうなのでしょうか。