2015-02-26 4 views
-4

Я делал эксперимент по скорости и приурочил встроенную функцию к обычной функции, и я неоднократно получал лучшее время на регулярной функции. Можете ли вы, пожалуйста, взглянуть на код и помочь мне разобраться, почему это означает, что инкрустация должна улучшить скорость.C++: Почему регулярная функция работает быстрее, чем функция Inline?

Благодаря

#include "stdafx.h" 
#include <iostream> 
#include "time.h" 

inline int getMaxInline(int x, int y) 
{ 
    return (x > y) ? x : y; 
} 

int getMaxRegular(int, int); 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    clock_t inlineStart; 
    clock_t inlineFinish; 
    clock_t regularStart; 
    clock_t regularFinish; 

    inlineStart = clock(); 
    std::cout<<"inline max of 20 and 10 = "<<getMaxInline(10, 20)<<std::endl; 
    inlineFinish = clock(); 


    std::cout<<"Time elapsed for inline = "<<(double(inlineFinish - inlineStart)/CLOCKS_PER_SEC)<<std::endl; 


    regularStart = clock(); 
    std::cout<<"regular max of 20 and 10 = "<<getMaxRegular(20, 10)<<std::endl; 
    regularFinish = clock(); 

    std::cout<<"Time elapsed for regular = "<<(double(regularFinish - regularStart)/CLOCKS_PER_SEC)<<std::endl; 

    return 0; 
} 


int getMaxRegular(int x, int y) 
{ 
    return (x > y) ? x : y; 
} 

Моего последнее 3 испытания гласило:

рядных = 0,042 регулярного = 0,003

рядных = 0,004 регулярного = 0,002

рядные = 0,006 регулярного = 0,002

Любые идеи?

Благодаря

+2

Вывод, который вы показываете, не является выходным кодом.ваша функция getMaxRegular не отображается. как мы знаем, что это не сфальсифицировано? Кроме того, inline - это предложение, а не команда. вам нужно убедиться, что он, по сути, встроен компилятором. – thang

+4

Метод синхронизации также полностью фиктивный. –

+2

Также часы: возвращает процессорное время, затрачиваемое программой. Это не реальное время работы ... и посмотрите на свои #s. они настолько малы, что вы, вероятно, просто измеряете шум. в этом посте так много чего не так. – thang

ответ

0

Я не думаю, что часы будут достаточно зернистым, чтобы дать вам точные цифры для такой маленькой функции. Вместо этого, время, в течение которого выполняется цикл, чтобы вызвать каждую функцию, например, десять тысяч или сто тысяч раз, а затем разделить полученное время на кол-во вызовов, чтобы получить более точное измерение. Попытайтесь выбрать количество циклов, которое позволит каждому циклу работать от одной до десяти секунд.

Кроме того, не печатайте вещи, пока вы это определяете. Затем вы выбираете ввод-вывод, а не только вызов функции. В этом случае операция ввода-вывода в этом случае займет гораздо больше времени, чем ваша фактическая функция.

+0

Также: отключите любое масштабирование частоты процессора перед запуском теста. Также: запустите тест в perf или callgrind или vtune, чтобы получить подробную информацию о времени. Также: любой современный компилятор с LTO оптимизирует это. – peppe

3

Строго говоря, ваша программа не сконструирована даже удаленно, как построены программы, которые точно измеряют производительность кода. При вызове встроенной функции все выходные коды не горят в кэше ЦП и тайниках предсказания ветвлений. В вашем вызове функции, отличной от встроенной, это так. Это будет полностью доминировать в любых микроскопических различиях из-за избежания одной операции вызова/возврата.

1

Разница между функцией inline и функцией, не входящей в нее, зависит от 100% от компилятора и настроек оптимизации.

Ключевое слово inline является предложением для компилятора. Разрешается игнорировать эту рекомендацию.

Учитывая две равные функции, единственной разницей между функцией inline и не-встроенной функцией должно быть служебная информация о вызове и возврате. Это не менее двух инструкций процессора, вызова и возврата. Предположим, что команды вызова и возврата принимают по 1 мс каждый (что очень, очень, медленно). Вы сохранили 2 миллисекунды путем вложения. Ожидание ввода/вывода пользователя в считанные секунды. Файл ввода-вывода обычно составляет миллисекунды. Значит ли это, что 2 миллисекунды значительны? В общем случае нет.

Но подождите, это еще не все, что вы получаете. Удалив дополнительный вызов, в некоторых процессорах вы запретите перезагрузку кэша команд. Это может сэкономить вам огромные наносекунды. Опять же, это важно? Возможно нет.

С другой стороны монеты вы потратили много времени на разработку и экспериментируете с этим. В этот раз вы могли бы потратить на то, чтобы ваша программа была более надежной и правильной. Ваш вид оптимизации -ininining - называется микро-оптимизацией. Обычно эти оптимизации имеют очень низкую доходность инвестиций.

Смежные вопросы