Как мне сравнить метапрограмму C ++ с кодом C? (время выполнения) - PullRequest
0 голосов
/ 19 августа 2009

Я перенес C-программу в C ++ шаблон мета-программы. Теперь я хочу сравнить время выполнения. Поскольку в программе на C ++ почти нет времени выполнения, как мне сравнить эти две программы.
Могу ли я сравнить время выполнения C со временем компиляции C ++? или это просто несопоставимо?

Ответы [ 6 ]

5 голосов
/ 19 августа 2009

Вы можете сравнить все, что вы хотите сравнить. Не существует единственного истинного правила того, что следует сравнивать.

Вы можете сравнить время, необходимое для выполнения каждой версии, или время, необходимое для компиляции каждой версии.

Или вы можете сравнить длину программы или количество символов 'r' в исходном файле. Вы можете сравнить временную метку каждого файла.

То, как вы должны сравнить две программы, зависит от того, что вы хотите показать!

Если вы хотите показать, что одно выполняется быстрее другого, затем запустите оба, время, сколько они потребуются для выполнения, и сравните эти числа.

Если вы хотите показать, что один компилируется быстрее другого, то время, необходимое для их компиляции.

Если вы считаете, что отношение между временем компиляции программы на C ++ и временем выполнения программы на C является релевантным, сравните их.

Решите, что вы хотите показать. Тогда ты будешь знать, с чем сравнивать.

2 голосов
/ 19 августа 2009

, поскольку программа на C ++ всегда будет давать один и тот же результат, зачем беспокоиться о каком-либо из них? вычислить результат один раз с помощью любой программы, а затем заменить оба на:

int main()
{
   printf("<insert correct output here>\n");
   return 0;
}
2 голосов
/ 19 августа 2009

Если я правильно понимаю, вы переписали программу на С, полностью основанную на шаблонах? В результате вы сравниваете время, необходимое для запуска программы на C, с программой на C ++, которая почти не занимает времени, а просто записывает результат.

В этом случае, я не думаю, что это вполне сравнимо - конечный пользователь увидит, что запуск программы на C займет х секунд, а выполнение C ++ завершится немедленно. Тем не менее, разработчик увидит, что программа на C компилируется через x секунд, а C ++ - на много секунд.

Вы можете сравнить время компиляции C ++ со временем выполнения C, и если приложение предназначено для получения результата и никогда не запускается дважды, тогда да, вы можете сравнить время таким образом. Если программа рассчитана на многократное выполнение, вам нужно сравнить время выполнения.

Я просто надеюсь, что вы добавили много комментариев в код вашего шаблона C ++:)

PS. Мне любопытно - сколько времени занимает запуск C по сравнению с временем компиляции для обоих?

0 голосов
/ 20 августа 2009

Я думаю, что имеет смысл сравнить время компиляции двух программ, затем время выполнения, а затем вычислить, сколько прогонов вы амортизировали дополнительное время компиляции.

0 голосов
/ 19 августа 2009

Я думаю, вы пытаетесь это сделать:

Вы не сказали, что делает ваша c-программа, поэтому допустим, что она вычисляет косинусное число с некоторой заданной степенью точности. Вы преобразовали эту программу в эквивалент на основе шаблонов c ++, который делает то же самое, но во время компиляции, чтобы получить значение константы во время компиляции. Это разумно, так как у вас может быть алгоритм, который использует «жестко запрограммированные» значения косинуса, и вы предпочитаете не иметь таблицы случайных чисел. См. эту статью для примера реального использования этого (или выполните поиск по Blitz и / или Todd Veldhuizen для получения дополнительных примеров).

В этом случае вы хотите сравнить производительность во время компиляции синусоидального калькулятора C ++ с производительностью во время выполнения исходной версии C.

Прямое сравнение времени компиляции исходного файла C ++ с временем запуска версии C почти наверняка покажет, что время компиляции будет значительно медленнее. Но это вряд ли справедливое сравнение, поскольку компилятор делает гораздо больше, чем просто «выполняет» код шаблона.

РЕДАКТИРОВАТЬ: Вы можете компенсировать накладные расходы компилятора, создав копию вашей программы на C ++, которая имеет некоторый простой код, эквивалентный тому, который генерирует шаблонный код - то есть вы должны вручную скомпилировать свой шаблонный код, если в этом есть смысл. Если вы затем рассчитаете время компиляции этого источника, разница между этим временем и временем компиляции вашей исходной шаблонной программы на C ++, вероятно, равна времени, необходимому для выполнения шаблона.

0 голосов
/ 19 августа 2009

Современные компиляторы C и C ++ используют одни и те же бэкэнды, поэтому, скорее всего, генерируют один и тот же код сборки.

C ++ - это просто более аннотированный C, и вы все еще можете делать хороший C, пока Cplusplusing;)

C - это просто C ++, старый брат.

...