|
#1
|
||||
|
||||
Benchmark
Здраствуйте, я недавно начал изучать C++ и столкнулся с проблемой выбора IDE и компилятора. Остановился на 2-х IDE: VS2010 и Code::Blocks, решил посмотреть, какой из компиляторов: VS2010 или MinGW шустрее и скомпилировал 3 программки(+ Delphi 7). Вот код Delphi:
Код:
program D7Benchmark; {$APPTYPE CONSOLE} uses SysUtils, DateUtils; const REPEAT_NUM = 100000; function Fact(N: integer):integer; begin if (N = 1) or (N = 0) then Result := 1 else Result := N * Fact(N - 1); end; var i : integer; T1 : TDateTime; begin T1 := Now; for i := 1 to REPEAT_NUM do Write(Fact(15)); WriteLn('Num of calculatings:'); WriteLn(REPEAT_NUM); WriteLn('Time of working is:'); WriteLn(MilliSecondsBetween(Now, T1)); WriteLn('PressEnter'); ReadLn; end. Скорость поражает! VS сделал 10.000 итераций за 3с, Delphi 100.000 за 0.8с, MinGW 100.000 за 1с. Т.е Delphi на несколько порядков быстрее VS! Прокомментируйте Итерация от человека. Рекурсия — от Бога.
|
#2
|
||||
|
||||
мне тоже инетресно, правда ли)
|
#3
|
||||
|
||||
Открой в отладке да погляди.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#4
|
||||
|
||||
мне не это интересно
|
#5
|
|||
|
|||
Скорость часто зависит от библиотеки (я уж не говорю об организации данных и алгоритме), напр., для скоростной графики просто сослаться на Direct3D и всё будет в ажуре, ведь весь код в dll.
|
#6
|
||||
|
||||
В том и дело, что ссылаться на какие-то dll бессмысленно, MFC не использован -- только консоль. При этом супер компилер Microsoft оказался значительно хуже MinGW на очень простом алгоритме подсчета факториала. Мне интересно почему, ведь я включил все оптимизациии.
Итерация от человека. Рекурсия — от Бога.
|
#7
|
||||
|
||||
Ну вроде уже подсказали, сравни полученный машинный код - то бишь ассемблер.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
||||
|
||||
увы, но я не знаю ассемблер
Итерация от человека. Рекурсия — от Бога.
|
#9
|
||||
|
||||
На твой бенчхмарк могла повлиять банальная загрузка процессора, приоритет на процесс и т.д.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#10
|
||||
|
||||
очевидно, что они влияли, но:
1.приоритет одинаковый 2.загрузка минимальна 3.различие слишком велико! Тем более архив я приложил, можете проверить сами. Итерация от человека. Рекурсия — от Бога.
|
#11
|
||||
|
||||
Да я на счет этого не парюсь. Главное чтоб работало правильно.
Если уж надо чтоб усцаться быстро работало, можно написать на чистом асме, работая только через регистры, оптимизировав код так, чтобы лишних действий небыло в принципе. Но как говорят у нас в Одессе: "А оно вам надо?". — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 08.01.2012 в 21:34. |
#12
|
||||
|
||||
Avast-у очень не понравился файл собранный в Дельфи, возможно из-за упаковщика, а может подменён файл SysConst.pas.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#13
|
||||
|
||||
Вы не то тестировали. Ни для кого не секрет, что вывод через COUT в студии невероятно медленный. Я провел другой тест на вашем же примере:
Делфа: Код:
program D7Benchmark; {$APPTYPE CONSOLE} uses SysUtils, DateUtils; const REPEAT_NUM = 10000000; function Fact(N: integer):integer; begin if (N = 1) or (N = 0) then Result := 1 else Result := N * Fact(N - 1); end; type tin = array [0..0]of integer; var i : integer; T1 : TDateTime; j:^tin; begin getmem(j,100*sizeof(integer)); T1 := Now; for i := 0 to REPEAT_NUM-1 do j[i mod 100]:=Fact(i mod 2 + 14); WriteLn('Num of calculatings:'); WriteLn(REPEAT_NUM); WriteLn('Time of working is:'); WriteLn(MilliSecondsBetween(Now, T1)); WriteLn('PressEnter'); ReadLn; end. Код:
#include "stdafx.h" #include <iostream> #include <ctime> using namespace std; const int REPEAT_NUM = 10000000; int Fact(int N); int _tmain(int argc, _TCHAR* argv[]) { long c; int i,*j; j = new int[100]; c=clock(); for (i = 0; i < REPEAT_NUM; i++) j[i%100] = Fact(i%2+14); c=clock()-c ; cout << "Time is: " << c << "\n"; cout << "Press ENTER.."; cin >> i; return 0; } int Fact(int N) { if (N == 1 || N == 0) return 1; else return N * Fact(N - 1); } Результат: Делфи ХЕ - 1.7 сек, Студия - 0.9 сек. Такие сложности (с остатком от деления и записью в массив) для обмана оптимизации студии. Было так: Код:
for i:=1 to REPEAT_NUM do Fact(15); Потом сделал так: Код:
for i:=0 to REPEAT_NUM-1 do j[i mod 100]:=Fact(15); В результате сделал такой извратский тест. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 09.01.2012 в 15:19. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Dem0Men (03.02.2012)
|