powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Delphi быстрее С++?
25 сообщений из 113, страница 1 из 5
Delphi быстрее С++?
    #37405268
VanoPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень много дискуссий о том, какой язык лучше. Но все же советую всем, кто хочет разобраться, какой компилятор лучше Delphi или C++: быстрее компилирует и лучше оптимизирует код, сделать это СОБСТВЕННОРУЧНО и не верить никаким тестам. Большинство тестов - это просто реклама фанатов того или иного языка. Во многом в тестах используются специализированные функции конкретной среды, а этого для объективной оценки нужно избегать.
Во-первых, наиболее объективный ответ могут дать люди, которые в одинаковой степени хорошо знают языки и не имеет значения на каком из них писать. Я всю жизнь думал, что если писать графический движок или ядро некоторого сложного программного проекта, то его обязательно нужно писать на С++ (собственно так я и делал). Мол все вокруг говорят, что С++ лучше предназначен для этих целей, все операционные системы и драйвера на нем пишут и т.д. Но никто ни разу не говорил о том, что язык С++ для этого используется в силу его кроссплатформенности и исторически сложившихся предпочтений. К сожалению Delphi начинает сей путь только сейчас путем покорения Linux, MacOS своим открытым проектом Lazarus.
Во-вторых, сравнивать нужно не языки, а компиляторы! Язык – это лишь средство представления алгоритма, и тут уже предпочтение отдается «на цвет и вкус».
И в третьих, никакие интерпретируемые языки никогда не сравняться по скорости с компилируемыми (это я думаю очевидно). Хотя интерпретируемые и обладают рядом непревзойденных преимуществ над компилируемыми, но это отдельная история…
Итак, начнем тест. Было взято две среды: С++ – Microsoft Visual Studio 2008 Professional Edition и Embarcadero Delphi XE. На этих языках написано две одинаковые DLL библиотеки: LibC++.dll и LibDelphi.dll. Компиляция всех проектов проводилась Release с максимальной степенью оптимизации. Расчет выполнен простой: в массиве ищем максимальное и минимальное значение, потом нормируем весь вектор и вычисляем от него сумму синусов. Это наиболее характерные задачи компьютерной графики – расчетные математические.

Текст DLL библиотеки на Delphi.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
library LibDelphi;
uses  Math;
type
  // Создадим аналог массивов в С++, чтоб работать идентично
  PDoubles = ^TDoubles;
  TDoubles = array [0..0] of Double;

function Calc(const V: PDoubles; Count: Integer): Double; stdcall;
var
  i: Integer;
  MinVal, MaxVal: Double;
begin
  Result := 0.0;
	MaxVal := -MaxDouble;
	MinVal := MaxDouble;
	for i := 0 to Count-1 do
    begin
		  if v[i] > MaxVal then MaxVal := v[i];
		  if v[i] < MinVal then MinVal := v[i];
    end;
	for i := 0 to Count-1 do
    Result := Result + sin(2*(v[i]-MinVal)/(MaxVal-MinVal) - 1);
end;

exports Calc;
begin
end.
Текст DLL библиотеки на C++.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <math.h>
#include <float.h>

__declspec(dllexport) double __stdcall Calc(const double *v, int Count)
{
	if (Count <= 0) return 0.0;
	double Res = 0.0;
	double MaxVal = -DBL_MAX;
	double MinVal = DBL_MAX;
	for (int i = 0; i < Count; i++)
	{
		if (v[i] > MaxVal) MaxVal = v[i];
		if (v[i] < MinVal) MinVal = v[i];
	};
	for (int i = 0; i < Count; i++)
		Res += sin(2*(v[i] - MinVal)/(MaxVal - MinVal) - 1);
	return Res;
};
Текст тестовой программы, которая вызывает эти библиотеки. Написана на Delphi, чтоб не создавать lib от Delphi библиотеки при ее подключении в сишному коду.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
const
  COUNT = 10000000; //кол-во элементов массива

type
  PDoubles = ^TDoubles;
  TDoubles = array [0..0] of Double;

function CalcC(const V: PDoubles; Count: Integer): Double; stdcall; external 'LibC++.DLL' name 'Calc';
function CalcD(const V: PDoubles; Count: Integer): Double; stdcall; external 'LibDelphi.DLL' name 'Calc';

var
  V: PDoubles;
  Res1, Res2: Double;
  i, t0, t1, t2: Integer;
begin
  Writeln('Start');
  GetMem(V, COUNT*SizeOf(Double));

  for i := 0 to COUNT-1 do
    V[i] := Random;

  t0 := GetTickCount;
  Res1 := CalcC(V, COUNT);
  t1 := GetTickCount;
  Res2 := CalcD(V, COUNT);
  t2 := GetTickCount;

  Writeln('Function C++: ' + IntToStr(t1-t0) + ' ms');
  Writeln('Function Delphi: ' + IntToStr(t2-t1) + ' ms');
  Writeln('Res C++: ' + FormatFloat('0.000', Res1));
  Writeln('Res Delphi: ' + FormatFloat('0.000', Res2));

  FreeMem(V, COUNT*SizeOf(Double));
  Writeln('Finish');
end.

Результаты такие: LibDelphi.dll – размер 81,5 Кб; LibC++.dll – размер 61,0 Кб. При больших объемах кода эта разница в процентном отношении может быть меньше.
Вывод консоли:

Код: plaintext
1.
2.
3.
4.
5.
Start
Function C++: 1063 ms
Function Delphi: 500 ms
Res C++: -176,573
Res Delphi: -176,573
Finish

Если честно, не понимаю почему такой результат, я ожидал увидеть совсем обратное. Разница: функция Delphi в 2 раза быстрее аналогичной на С++! Оптимизация на максимуме в обоих проектах. Буду благодарен, если найдете ошибку в моих рассуждениях, потому что истина дороже.
Таким образом, мы протестировали простые две математические функции и увидели большую разницу (хотя в правдоподобности я сомневаюсь, сильно уж большая разница).
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405292
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, в подавляющем большинстве случаев скорость компиляции - один из последних факторов при современных мощах писюков. Взять например скриптовые языки, и наверное, самый тормознутый из них - руби: хотя скорость исполнения кода на нем может быть на 2-3! порядка ниже откомпилированного кода С или Паскаля, это не сводит его поклонников к нулю (точнее, не этот фактор, т.к. руби всеже просел по популярности).
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405301
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, вы о скорости компиляции или о скорости выполнения?
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405375
VanoPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Edd.DragonГоспода, вы о скорости компиляции или о скорости выполнения?
Конечно речь сейчас идет о времени выполнения функции
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405387
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanoPro,
Ну просто и в твоем сообщении и у arni встречается упоминание времени компиляции, но не ясно, к чему.

----

Если фраза "максимальные оптимизации" по поводу Дельфи в принципе не очень расплывчата, то на счет c++ хотелось бы увидеть параметры компиляции.
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405426
VanoPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходники можете скачать. Пути настроены относительные
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405430
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanoPro,

Ну вот решил я твои тексты под VC 2005 vs Delphi7 прогнать.

Сходу как у тебя дельфя не смогла найти точку входа в процедуру сишной библиотеки, потому я сделал cdecl и убрал stdcall:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
#include <math.h>
#include <float.h>

extern "C"
{
	
__declspec(dllexport) double vcCalc(const double *v, int Count)
{
	if (Count <=  0 ) 
	{
		return  0 . 0 ;
	}
	
	double Res =  0 . 0 ;
	double MaxVal = -DBL_MAX;
	double MinVal = DBL_MAX;
	
	for(int i =  0 ; i < Count; i++)
	{
		if (v[i] > MaxVal) MaxVal = v[i];
		if (v[i] < MinVal) MinVal = v[i];
	};
	for (int i =  0 ; i < Count; i++)
	{
		Res += sin( 2 *(v[i] - MinVal)/(MaxVal - MinVal) -  1 );
	}
	return Res;
};

Ну и в дельфе соответственно. Завелось. Но результат вышел еще печальнее:

Код: plaintext
1.
2.
3.
4.
5.
Function C++:  2640  ms
Function Delphi:  766  ms
Res C++: - 176 , 573 
Res Delphi: - 176 , 573 
Finish

Ок. А давай проверим, не выходя из VC и не делая никаких dll-ек.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#include <math.h>
#include <windows.h>

#include <iostream>

using namespace std;

double vcCalc(const double* v, int count)
{
	if(count <=  0 ) return  0 . 0 ;
	
	double result =  0 . 0 ;
	double max = - 1 ;
	double min =  2 ;
	
	for(int i =  0 ; i < count; i++)
	{
		if(v[i] > max) max = v[i];
		if(v[i] < min) min = v[i];
	};
	
	for(int i =  0 ; i < count; i++)
	{
		result += sin( 2  * (v[i] - min) / (max - min) -  1 );
	}
	
	return result;
};

const int count =  10000000 ; 

int main(int argc, char* argv[])
{
	double* v = new double[count];

	for(int i =  0 ; i < count; ++i) v[i] = (double)rand() / RAND_MAX;

	DWORD t0 = GetTickCount();
	double res = vcCalc(v, count);
	DWORD t1 = GetTickCount();

	cout << (t1 - t0) << " ms, result = " << res << endl;

	return  0 ;
}

Все нормально? Вроде да. Рендомы от 0 до 1. Ну код переформатировал и поменял константы.

Результат: 600 ms

Давай тоже самое сделаем и с дельфи, т.е. дельфийную функциию вкомпилим в exe. Ничего не изменилось: 780 ms .
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405431
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, еще:

d7lib.dll - 41 472 байта
vclib.dll - 6 656 байт всего ))
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405447
VanoPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тоже попробовал наоборот в С++ использовать Delphi, в Delphi - C++, просто без библиотек с одними только ехе-шниками.
Вердикт: код на С++ на 16,4 % работает быстрее, чем на Delphi .
Замечание: вся проблема с таким замедлением была видимо в вызову функции (хотя не понятно почему)
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405463
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зато код на дэлфи быстрее компилируется, в разы.
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405465
VanoPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZyK_BotaNзато код на дэлфи быстрее компилируется, в разы.
Согласен, особенно когда кода много, а ты начинаешь править и менять при этом компилировать и запускать, то в С++ намного больше для этого требуется времени.
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405472
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VanoPro,

Когда кода очень много, то обычно не принято его в один объектный файл компилировать. В итоге перекомпилируешь только то, что правишь.

Ну и в с++ ты пользуешься сложными типами данных, которые реализованы шаблонами. В Дельфи же никаких шаблонов. В итоге конечно же компилятору с++ приходится много "думать", т.к. за простыми, казалось бы, строками могут скрывать весьма зубодробительные конструкции и взаимосязи. Плохо это или хорошо? Кому писать простенькие программки, тому наверняка плохо. Особенно пытаться понять что-то в монструозных сообщениях об ошибке, когда в них вываливаются километровые определения многоэтажного шаблонного типа ))
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405474
VanoPro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Edd.DragonНу и в с++ ты пользуешься сложными типами данных, которые реализованы шаблонами. В Дельфи же никаких шаблонов. В итоге конечно же компилятору с++ приходится много "думать", т.к. за простыми, казалось бы, строками могут скрывать весьма зубодробительные конструкции и взаимосязи. Плохо это или хорошо? Кому писать простенькие программки, тому наверняка плохо. Особенно пытаться понять что-то в монструозных сообщениях об ошибке, когда в них вываливаются километровые определения многоэтажного шаблонного типа ))

Согласен и с этим. Вобщем основная задача этой темы была определить лучший компилятор по скорости выполняемого кода. Эта задача была успешно выполнена в пользу С++. А дальше копать не будем. Все равно эти "священные" войны бесконечны. Есть поклонники и того языка и другого. Пусть каждый пишет на своем в удовольствие и без ошибок :)
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405477
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonVanoPro,

Ну и в с++ ты пользуешься сложными типами данных, которые реализованы шаблонами.

ты отстал от жизни ))
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405479
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNEdd.DragonVanoPro,

Ну и в с++ ты пользуешься сложными типами данных, которые реализованы шаблонами.

ты отстал от жизни ))

http://sjrd.developpez.com/delphi/tutoriel/generics/
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405497
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN,

Я про них и забыл
Таки да, и тут прикрутили
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405518
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может быть дело в разных менеджерах памяти?
как насчет измерить время уже в функции(я про си)?
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405727
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DLL загрузить нужно сначала, потом измерениями заниматься.
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405866
Александр2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор, зырьте как компиляторы сравнивают и заканчивайте заниматься изобретением лисапета :)
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405868
Александр2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из этого видно, что в целом компиляторы борланда сосут :)
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37405953
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр2из этого видно, что в целом компиляторы борланда сосут :)Табличка означает, что на этапе компиляции, например выражение а+а+а+а заменяется на а*4?
Дааа, это крутая оптимизация, наверное в каждой программе по много таких выражений ;)
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37406036
alneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для изобретателей лисапета, глде версии компиляторов на рисунке?
компилятор с++ будет медленне компилятора делфи за счет того, что он двухпроходный (wo-pass compiler).
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37406120
Александр2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alneoдля изобретателей лисапета, глде версии компиляторов на рисунке?
компилятор с++ будет медленне компилятора делфи за счет того, что он двухпроходный (wo-pass compiler).
скорость компиляции слабо интересует, интересует скорость выполнения того, что накомпилировали

насчет версий - это срез на 2010 год
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37406128
alneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
когда-то давно сравнивал скорости сишных компиляторов под винду, на первых местах был интел и ватком, борландовский был самый медленный. но это были синтетеические тесты. на скорости работы приложений(клиент-серверные) это никак не сказывалось :-)
...
Рейтинг: 0 / 0
Delphi быстрее С++?
    #37406142
Александр2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alneoкогда-то давно сравнивал скорости сишных компиляторов под винду, на первых местах был интел и ватком, борландовский был самый медленный. но это были синтетеические тесты. на скорости работы приложений(клиент-серверные) это никак не сказывалось :-)
смотря как мерять если на глазок, то наверное, не сказывается
а если счет идет на миллисекунды, то очень сильно сказывается :)
...
Рейтинг: 0 / 0
25 сообщений из 113, страница 1 из 5
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Delphi быстрее С++?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]