powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Бенчмарки C#, C++, Java, Delphi
25 сообщений из 265, страница 2 из 11
Бенчмарки C#, C++, Java, Delphi
    #34429151
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonMaster Alex.

Я обратил внимание, что исходники Delphi присутствуют в двух вариантах. Delphi и Delphi.FAST с различными оптимизациями под MMX и SSE. Та статистика Delphi, которую вы приводите, какому бинарнику соответсвтует?

Во вчерашних забегах
Delphi10F - это сборка Delphi 10 с Fast юнитами (FastMem+FastCode+FastMove)
Delphi7 - это сборка на Delphi 7 без Fast юнитов.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429251
sopromat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master Alex
Цель данного теста - не повесить ярлык, это, вот рулез, а это - suxx, а прежде всего для себя (меня :) выяснить, как ведет себя Java на подобных задачах (конвертирование, архивация).
Спасибо за тесты. Если не сложно, можете привести сколько памяти отъедается в каждом тесте? Интересно, какой ценой достигаются эти результаты в каждом случае.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429309
OracleX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master AlexCильно сомневаюсь - там каждая строчка переписана влоб в лоб.К сожалению, портирование LZMA на Delphi не оптимизировано, о чем уже говорил Grexhide .
Код: 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.
Byte DecodeNormal(NRangeCoder::CDecoder *rangeDecoder)
  {
    UInt32 symbol =  1 ;
    RC_INIT_VAR
    do
    {
      // symbol = (symbol << 1) | _decoders[0][symbol].Decode(rangeDecoder);
      RC_GETBIT(kNumMoveBits, _decoders[symbol].Prob, symbol)
    }
    while (symbol < 0x100);
    RC_FLUSH_VAR
    return (Byte)symbol;

#define RC_GETBIT2(numMoveBits, prob, mi, A0, A1) \
  { UInt32 bound = (range >> NCompress::NRangeCoder::kNumBitModelTotalBits) * prob; \
  if (code < bound) \
  { A0; range = bound; \
    prob += (NCompress::NRangeCoder::kBitModelTotal - prob) >> numMoveBits; \
    mi <<=  1 ; } \
  else \
  { A1; range -= bound; code -= bound; prob -= (prob) >> numMoveBits; \
    mi = (mi + mi) +  1 ; }} \
  RC_NORMALIZE

#define RC_GETBIT(numMoveBits, prob, mi) RC_GETBIT2(numMoveBits, prob, mi, ; , ;)

#define RC_FLUSH_VAR \
  rangeDecoder->Range = range; \
  rangeDecoder->Code = code;
  }
Код: 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.
 function  TLZMADecoder2.DecodeNormal( const  rangeDecoder:TRangeDecoder):byte;
 var  symbol:integer;
 begin 
symbol :=  1 ;
 repeat 
  symbol := (symbol  shl   1 )  or  rangeDecoder.DecodeBit(m_Decoders, symbol);
   until   not  (symbol < $ 100 );
result:=symbol;
 end ;

 function  TRangeDecoder.DecodeBit( var  probs:  array   of  smallint; const  index:integer):integer;
 var  prob,newbound:integer;
 begin 
prob:=probs[index];
newbound:=(Range  shr  kNumBitModelTotalBits) * prob;
 if  (integer((integer(Code)  xor  integer($ 80000000 ))) < integer((integer(newBound)  xor  integer($ 80000000 ))))  then   begin 
   Range := newBound;
   probs[index] := (prob + ((kBitModelTotal - prob)  shr  kNumMoveBits));
    if  ((Range  and  kTopMask) =  0 )  then   begin 
      Code := (Code  shl   8 )  or  ReadByte(stream);
      Range := Range  shl   8 ;
       end ;
   result:= 0 ;
    end   else   begin 
       Range := Range - newBound;
       Code := Code - newBound;
       probs[index] := (prob - ((prob)  shr  kNumMoveBits));
        if  ((Range  and  kTopMask) =  0 )  then   begin 
          Code := (Code  shl   8 )  or  ReadByte(stream);
          Range := Range  shl    8 ;
           end ;
       result:= 1 ;
        end ;
 end ;

Посмотрите еще
Код: 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.
 function  ReadByte( const  stream:TStream):byte;
 begin 
stream.Read(result, 1 );
 end ;

 function  TBufferedFS.Read( var  Buffer; Count: Longint): Longint;
 var  p:PByteArray;
    bytestoread:integer;
    b:integer;
 begin 
 if  Mode=BFMWrite  then  flush;
mode:=BFMRead;
result:= 0 ;
 if  count<=bytesinbuffer  then   begin 
    //all data already in buffer 
   move(membuffer[bufferpos],buffer,count);
   bytesinbuffer:=bytesinbuffer-count;
   bufferpos:=bufferpos+count;
   result:=count;
    end   else   begin 
       bytestoread:=count;
        if  (bytestoread<> 0 ) and (bytesinbuffer<> 0 )  then   begin 
           //read data remaining in buffer and increment data pointer 
          b:=Read(buffer,bytesinbuffer);
          p:=PByteArray(@(TByteArray(buffer)));
          bytestoread:=bytestoread-b;
          result:=b;
           [b]end   else  p:=@buffer;
        if  bytestoread>=BufferSize  then   begin 
           //data to read is larger than the buffer, read it directly 
          result:=result+ inherited  Read(p^,bytestoread);
           end   else   begin 
               //refill buffer 
              ReadBuffer;
               //recurse 
              result:=result+Read(p^,math.Min(bytestoread,bytesinbuffer));
               end ;
        end ;
 end ;
и соответственно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  bool ReadByte(Byte &b)
  {
    if(_buffer >= _bufferLimit)
      if(!ReadBlock())
        return false;
    b = *_buffer++;
    return true;
  }
Теперь понятно, о чем говорил уважаемый Grexhide ?
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429329
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, господа, мы убедились, что лобового переписывания алгоритма - недостаточно. Требуется оптимизация. Я думаю такое скажет, бия себя в грудь каждый приверженец того или иного ЯП/технологии. Ибо везде есть свои нюансы, tips, tricks и т.п.

Думаю, что после того, как Delphi-йский порт немного причешут и пригладят он займёт своё достойное место в чарте рядом с нативными компиллерами.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429336
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OracleXК сожалению, портирование LZMA на Delphi не оптимизировано, о чем уже говорил Grexhide .
по сравнению с Java и C#? ;) про С++ - никто не спорит - там и так все со скоростью ясно.
смотрим код на Delphi еще раз:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
function TLZMADecoder2.DecodeNormal(const rangeDecoder:TRangeDecoder):byte;
var symbol:integer;
begin
symbol :=  1 ;
repeat
  symbol := (symbol shl  1 ) or rangeDecoder.DecodeBit(m_Decoders, symbol);
  until not (symbol < $ 100 );
result:=symbol;
end;

Смотрим сорцы на Java:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	
		
			public byte DecodeNormal(SevenZip.Compression.RangeCoder.Decoder rangeDecoder) throws IOException
			{
				int symbol =  1 ;
				do
					symbol = (symbol <<  1 ) | rangeDecoder.DecodeBit(m_Decoders, symbol);
				while (symbol < 0x100);
				return (byte)symbol;
			}


смотрим еще раз:
Код: 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.
function TRangeDecoder.DecodeBit(var probs: array of smallint;const index:integer):integer;
var prob,newbound:integer;
begin
prob:=probs[index];
newbound:=(Range shr kNumBitModelTotalBits) * prob;
if (integer((integer(Code) xor integer($ 80000000 ))) < integer((integer(newBound) xor integer($ 80000000 )))) then begin
   Range := newBound;
   probs[index] := (prob + ((kBitModelTotal - prob) shr kNumMoveBits));
   if ((Range and kTopMask) =  0 ) then begin
      Code := (Code shl  8 ) or ReadByte(stream);
      Range := Range shl  8 ;
      end;
   result:= 0 ;
   end else begin
       Range := Range - newBound;
       Code := Code - newBound;
       probs[index] := (prob - ((prob) shr kNumMoveBits));
       if ((Range and kTopMask) =  0 ) then begin
          Code := (Code shl  8 ) or ReadByte(stream);
          Range := Range shl   8 ;
          end;
       result:= 1 ;
       end;
end;

Смотрим сорцы на Java:
Код: 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.
	public int DecodeBit(short []probs, int index) throws IOException
	{
		int prob = probs[index];
		int newBound = (Range >>> kNumBitModelTotalBits) * prob;
		if ((Code ^ 0x80000000) < (newBound ^ 0x80000000))
		{
			Range = newBound;
			probs[index] = (short)(prob + ((kBitModelTotal - prob) >>> kNumMoveBits));
			if ((Range & kTopMask) ==  0 )
			{
				Code = (Code <<  8 ) | Stream.read();
				Range <<=  8 ;
			}
			return  0 ;
		}
		else
		{
			Range -= newBound;
			Code -= newBound;
			probs[index] = (short)(prob - ((prob) >>> kNumMoveBits));
			if ((Range & kTopMask) ==  0 )
			{
				Code = (Code <<  8 ) | Stream.read();
				Range <<=  8 ;
			}
			return  1 ;
		}
	}

Найди 10 различий :)

OracleX
Посмотрите еще
Код: plaintext
1.
 function  TBufferedFS.Read( var  Buffer; Count: Longint): Longint;


В бенчмарке файлового чтения нет - так что этот код не используется.

OracleX
Теперь понятно, о чем говорил уважаемый Grexhide ?
Неа :)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429341
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИтак, господа, мы убедились, что лобового переписывания алгоритма - недостаточно. Требуется оптимизация.


А зачем - интересно же сравнить одинаковый код (без оптимизации) на разных языках -
вот есть C#, есть Java и Delphi - код один в один - производительность разная.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429344
OracleX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используется этот код, такой же дубовый :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 function  TMyInputStream.Read( var  Buffer; Count: Longint): Longint;
 var  b:int64;
 begin 
 try 
b:=_size-_pos;
 if  b>count  then  b:=count;
result:=b;
move(_buffer^[_pos],buffer,b);
_pos:=_pos+b;
 except  writeln('inread error');
 end ;
 end ;
Java и C# меня не волнуют.
Ищите сами в них 10 различий.

Зато код на C++ (опытный прогер поймет) оптимальнее,
чем код, портированный на Delphi, причем в ключевых с т.зрения производительности местах.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429349
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OracleX
Java и C# меня не волнуют.
Ищите сами в них 10 различий.

Так портировали код, скорее всего с Java на Delphi, а не с оптимизированного Си, так что сравнивать интересно сравнимое.

OracleX
Зато код на C++ (опытный прогер поймет) оптимальнее,
чем код, портированный на Delphi, причем в ключевых с т.зрения производительности местах.
Так тут никто и не спорит - еще и сам компилятор C++ мощнее, чем компилятор Delphi - тут сразу были разные весовые категории :)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429366
OracleX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton прав насчет ущербности портирования без учета особенностей.

Кроме того, подскажите, адекватно ли сравнивать по скорости вызов
ReadByte(stream) в коде Delphi и
Stream.read() в коде Java?

Причем, код Java совсем не похож на код 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.
 static   class  MyInputStream  extends  java.io.InputStream
	{
		 byte [] _buffer;
		 int  _size;
		 int  _pos;
		
		 public  MyInputStream( byte [] buffer,  int  size)
		{
			_buffer = buffer;
			_size = size;
		}
		
		 public   void  reset()
		{ 
			_pos =  0 ; 
		}
		
		 public   int  read()
		{
			 if  (_pos >= _size)
				 return  - 1 ;
			 return  _buffer[_pos++] & 0xFF;
		}
	};
Сделайте весь код более похожим (и Java и Delphi), тогда посмотрим.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429384
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OracleXСделайте весь код более похожим (и Java и Delphi), тогда посмотрим.

Согласен, как автор порта соптимизирует, тогда и посмотрим :)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429402
OracleX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другими словами, анализ исходников показал,
что Alan Birtles проделал огромную и полезную работу,
портировал LZMA на Delphi.

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

Все остальные выводы, сделанные по приведенным бенчмаркам, не корректны.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429413
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OracleXЕсть очевидные направления оптимизации его кода.

Oki, щас попробую профайлер напустить на это творение ;)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429436
OracleX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другой вариант исходников LZMA
Страна ждет новых героев :)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429447
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OracleX Другой вариант исходников LZMA
Страна ждет новых героев :)

Там нет модуля бенчмарков :)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429450
OracleX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Они и не нужны, и так видны не оптимальные места.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429466
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OracleXОни и не нужны, и так видны не оптимальные места.

Ну, вот когда будет бенчмарк модуль, тогда и можно будет сравнивать. А пока LZMA бенчмарки дельфи порт продувает, так кривой, а прямого нет. Даже Рассел (автор InnoSetup) не стал заморачиваться с портированием LZMA упаковщика под Delphi - просто собрал сишную dll и радуется жизни.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429523
OracleX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master AlexА пока LZMA бенчмарки дельфи порт продуваетТут Вы правы.
Проведенная Вами работа по сравнению разноязычных вариантов портирования
полезна, в основном, для тех, кто может заглянуть в "черный ящик".

Я за 3 мин сделал декодирование на 4.3% быстрее в Delphi7.
Будет время, продолжу оптимизацию, чтобы обогнать Java-реализацию.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429536
LMM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Master Alex
Однозначно, нужна оптимизация под каждую среду и язык программирования, пример - пузырьковая сортировка, C/C++ сосет и у Дельфи и у C#(/topic/241745&pg=27)
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429610
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LMMto Master Alex
Однозначно, нужна оптимизация под каждую среду и язык программирования, пример - пузырьковая сортировка, C/C++ сосет и у Дельфи и у C#(/topic/241745&pg=27)

это чтоле?
Код: plaintext
int arr[ 200000 ];\nfor (int i =  0 ; i <  200000 ; i++)\n    arr[i] = (int)((i %  9 ) *  sinf(i));\n\ntm t1;\n_getsystime(&t1);\nprintf( "%d:%d:%d", t1.tm_hour, t1.tm_min, t1.tm_sec);\n\nbool exit;\nint buf;\ndo\n{\n    exit = true;\n    for (int i =  1 ; i <  200000 ; i++)\n    if (arr[i -  1 ] > arr[i])\n    {\n          buf = arr[i -  1 ];\n          arr[i -  1 ] = arr[i];\n          arr[i] = buf;\n          exit = false;\n     }\n}\nwhile (!exit);\n\ntm t2;\n_getsystime(&t2);\nprintf( "\\n%d:%d:%d", t2.tm_hour, t2.tm_min, t2.tm_sec);\n\nscanf("%d");

аффтар понятия о си не имеет. кстати, он там про это и писал. это не пузырьковая сортировка, а программа для временной задержки.

ИТАК. вот мой пример -
Код: plaintext
#include <iostream.h>\n#include <time.h>\n#include <stdlib.h>\n\n#define SIZE  200000 \n\nvoid main()\n{\n\tint i, j, k;\n\tint a[SIZE];\n\tlong l;\n\tfor (i= 0 ; i<SIZE; i++)\n\t{\n\t\ta[i] = (clock() <<  16 ) + rand();\n\t}\n\n\tl = clock();\n\tfor (i= 0 ; i<SIZE; i++)\n\t{\n\t\tfor (j=i+ 1 ; j<SIZE; j++)\n\t\t{\n\t\t\tif (a[i]>a[j])\n\t\t\t{\n\t\t\t\tk = a[i];\n\t\t\t\ta[j] = a[i];\n\t\t\t\ta[j] = k;\n\t\t\t}\n\t\t}\n\t}\n\n\tcerr << (clock()-l)/ 1000 . 0  << "s.";\n}

тот тест делфи со своими 140 секундами сосет конкретно: 83 секунды.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429613
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
п.с. это только VS6

аффтопитезь: объект либо именован, либо не существует
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429624
OracleX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AklinВ Вашем коде есть не понятное место:
Код: plaintext
1.
2.
a[j] = a[i];
a[j] = k;
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429640
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Master Alex OracleXОни и не нужны, и так видны не оптимальные места.
Даже Рассел (автор InnoSetup) не стал заморачиваться с портированием LZMA упаковщика под Delphi - просто собрал сишную dll и радуется жизни.

Да ради бога. Никто не запрещает слинковать .obj в проект на Delphi.

Но за "продувание" слив таки засчитан (в который раз).

-

P.S. Прямо дети
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429759
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grexhideНо за "продувание" слив таки засчитан (в который раз).

Еще раз - тестируются _готовые_ порты lzma, взятые с сайта 7zip, т.е. то что можно взять и не обрабатывая напильником (что 99% программистов скорее всего делать не будет) вставить в приложение.
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429791
OracleX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда нужно было называть тему по другому:
Бенчмарки LZMA на C++, C#, Java, Delphi
...
Рейтинг: 0 / 0
Бенчмарки C#, C++, Java, Delphi
    #34429843
LMM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Aklin

А че ты алгоритм весь переделал, в том топике тестировался один алгоритм для 3 сред(c#, delphi и c++)?
Если уж и написал свой, то и писал бы и для c# и для дельфи...
...
Рейтинг: 0 / 0
25 сообщений из 265, страница 2 из 11
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Бенчмарки C#, C++, Java, Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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