私は_rdtsc()
時間atoi()
をatof()
計っていましたが、かなり時間がかかっていることに気付きました。したがって、最初の呼び出しからはるかに高速なこれらの関数の独自のバージョンを作成しました。
Windows 7、VS2012 IDE を使用していますが、Intel C/C++ コンパイラ v13 を使用しています。-/O3 を有効にし、-/Ot (「優先する高速コード」) も有効にしています。私の CPU は Ivy Bridge (モバイル) です。
さらに調査したところ、atoi()
とatof()
が呼び出された回数が多いほど、実行が速くなったようです?? 私はマグニチュードをより速く話しています:
ループの外側から呼び出すとatoi()
、1 回だけ 5,892 CPU サイクルかかりますが、数千回の反復の後、これは 300 ~ 600 CPU サイクルに減少しました (実行時間の範囲が非常に大きくなります)。
atof()
最初は 20,000 ~ 30,000 CPU サイクルかかり、数千回の反復の後、18 ~ 28 CPU サイクルかかりました (これは、カスタム関数が最初に呼び出される速度です)。
誰かがこの効果を説明してもらえますか?
編集:言い忘れました-私のプログラムの基本的なセットアップは、ファイルからバイトを解析するループでした。ループ内では、明らかに atof と atoi を使用して上記に気づきます。しかし、ループの前に調べたところ、atoi と atof を 2 回呼び出し、ユーザーが作成した同等の関数を 2 回呼び出しただけで、ループの実行が速くなったように見えました。ループは 150,000 行のデータを処理し、各行には 3xatof()
またはatoi()
s が必要でした。繰り返しになりますが、メイン ループの前にこれらの関数を呼び出すと、これらの関数を 500,000 回呼び出すプログラムの速度に影響を与える理由がわかりません。
#include <ia32intrin.h>
int main(){
//call myatoi() and time it
//call atoi() and time it
//call myatoi() and time it
//call atoi() and time it
char* bytes2 = "45632";
_int64 start2 = _rdtsc();
unsigned int a2 = atoi(bytes2);
_int64 finish2 = _rdtsc();
cout << (finish2 - start2) << " CPU cycles for atoi()" << endl;
//call myatof() and time it
//call atof() and time it
//call myatof() and time it
//call atof() and time it
//Iterate through 150,000 lines, each line about 25 characters.
//The below executes slower if the above debugging is NOT done.
while(i < file_size){
//Loop through my data, call atoi() or atof() 1 or 2 times per line
switch(bytes[i]){
case ' ':
//I have an array of shorts which records the distance from the beginning
//of the line to each of the tokens in the line. In the below switch
//statement offset_to_price and offset_to_qty refer to this array.
case '\n':
switch(message_type){
case 'A':
char* temp = bytes + offset_to_price;
_int64 start = _rdtsc();
price = atof(temp);
_int64 finish = _rdtsc();
cout << (finish - start) << " CPU cycles" << endl;
//Other processing with the tokens
break;
case 'R':
//Get the 4th line token using atoi() as above
char* temp = bytes + offset_to_qty;
_int64 start = _rdtsc();
price = atoi(temp);
_int64 finish = _rdtsc();
cout << (finish - start) << " CPU cycles" << endl;
//Other processing with the tokens
break;
}
break;
}
}
}
ファイル内の行は次のようになります (間に空白行はありません)。
34605792 R dacb 100
34605794 A racb S 44.17 100
34605797 R kacb 100
34605799 Sacb S 44.18 100
34605800 R nacb 100
34605800 A tacb B 44.16 100
34605801 R gacb 100
atoi()
「R」メッセージの 4 番目の要素と「A」メッセージの 5 番目の要素で使用しatof()
、「A」メッセージの 4 番目の要素で使用しています。