Я использовал _rdtsc()
для времени atoi()
и atof()
, и я заметил, что они занимают довольно много времени. Поэтому я написал свои собственные версии этих функций, которые были намного быстрее первого вызова.
Я использую Windows 7, VS2012 IDE, но с компилятором Intel C/С++ v13. У меня есть -/O3 включен, а также -/Ot ( "favor fast code" ). Мой процессор - это мост Ivy (мобильный).
При дальнейших исследованиях казалось, что чем больше раз были названы atoi()
и atof()
, тем быстрее они выполнялись?? Я говорю быстрее:
Когда я вызываю atoi()
из моего цикла, только один раз, он занимает 5 892 цикла процессора, но после тысяч итераций это уменьшилось до 300-600 циклов процессора (довольно большой диапазон времени выполнения).
atof()
изначально занимает от 20 000 до 30 000 циклов процессора, а затем спустя несколько тысяч итераций он занимал 18-28 циклов процессора (это скорость, с которой моя пользовательская функция выполняется в первый раз, когда она вызывается).
Может ли кто-нибудь объяснить этот эффект?
EDIT: забыли сказать - базовой настройкой моей программы был цикл, анализирующий байты из файла. Внутри цикла я, очевидно, использую мой atof и atoi, чтобы заметить выше. Однако то, что я также заметил, заключается в том, что, когда я делал свое исследование перед циклом, дважды вызывал atoi и atof дважды, вместе с моими эквивалентными пользователем функциями дважды, казалось, что цикл выполнялся быстрее. Цикл обработал 150 000 строк данных, каждая строка требует 3x atof()
или 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 Рабс S 44.17 100
34605797 R kacb 100
34605799 Сабль S 44.18 100
34605800 R nacb 100
34605800 A tacb B 44,16 100
34605801 R gacb 100
Я использую atoi()
для 4-го элемента в сообщениях "R" и 5-го элемента в сообщениях "A" и используя atof()
для 4-го элемента в сообщениях "A".