Я запустил ваш program_variable
код в моей системе, чтобы получить базовый показатель производительности:
$ gcc -Wall test1.c
$ time ./a.out 1000 10
50004989999950500
real 0m55.531s
user 0m55.484s
sys 0m0.033s
Если я скомпилирую test1.c
с -O3
, тогда я получу:
$ time ./a.out 1000 10
50004989999950500
real 0m54.305s
user 0m54.246s
sys 0m0.030s
В третьем тесте я вручную устанавливаю значения limit
и skip
:
int limit = 1000, skip = 10;
Затем я заново запускаю тест:
$ gcc -Wall test2.c
$ time ./a.out
50004989999950500
real 0m54.312s
user 0m54.282s
sys 0m0.019s
Извлечениеatoi()
звонки не имеют большого значения.Но если я скомпилирую с включенной оптимизацией -O3
, я получу увеличение скорости:
$ gcc -Wall -O3 test2.c
$ time ./a.out
50004989999950500
real 0m26.756s
user 0m26.724s
sys 0m0.020s
Добавление макроса #define
для функции ersatz atoi()
немного помогло, но ничего особенного:
#define QSaToi(iLen, zString, iOut) {int j = 1; iOut = 0; \
for (int i = iLen - 1; i >= 0; --i) \
{ iOut += ((zString[i] - 48) * j); \
j = j*10;}}
...
int limit, skip;
QSaToi(4, argv[1], limit);
QSaToi(2, argv[2], skip);
И тестирование:
$ gcc -Wall -O3 -std=gnu99 test3.c
$ time ./a.out 1000 10
50004989999950500
real 0m53.514s
user 0m53.473s
sys 0m0.025s
Кажется, что дорогая часть - это atoi()
вызовы, если это единственное различие между -O3
Возможно, вы могли бы написать один двоичный файл, который проходит через тесты различных значений limit
и skip
, что-то вроде:
#define NUM_LIMITS 3
#define NUM_SKIPS 2
...
int limits[NUM_LIMITS] = {100, 1000, 1000};
int skips[NUM_SKIPS] = {1, 10};
int limit, skip;
...
for (int limitIdx = 0; limitIdx < NUM_LIMITS; limitIdx++)
for (int skipIdx = 0; skipIdx < NUM_SKIPS; skipIdx++)
/* per-limit, per-skip test */
Если вы заранее знаете свои параметрывремя компиляции, возможно, вы можете сделать это таким образом.Вы можете использовать fprintf()
, чтобы записать свой вывод в вывод файла с ограничением, с пропуском, если вы хотите, чтобы результаты были в отдельных файлах.