Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему так не любят Delphi? 
:(
    Опции темы
Akella
Дата 12.5.2013, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Речь о Delphi
Цитата
занимается разработкой программ для боевых самолетов

http://forum.vingrad.ru/index.php?showtopi...t&p=1293909
PM MAIL   Вверх
k0rvin
Дата 12.5.2013, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(Athari @  12.5.2013,  20:25 Найти цитируемый пост)
С какими результатами?

У меня примерно 25 минут на все уходит.
Код

Test  tooks 27.146829s ; lengths = [1]
Test  tooks  26.72835s ; lengths = [2]
Test  tooks  31.10416s ; lengths = [5]
Test  tooks 27.250136s ; lengths = [10]
Test  tooks 32.749949s ; lengths = [20]
Test  tooks 29.810985s ; lengths = [50]
Test  tooks 1m10.475009s ; lengths = [100]

Stage tooks 4m5.265418s ; lengths = [1 2 5 10 20 50 100], coeffs = [1]
----------------------------------------------------------------

Test  tooks 30.127252s ; lengths = [1 2]
Test  tooks 34.727249s ; lengths = [2 4]
Test  tooks 35.299303s ; lengths = [5 10]
Test  tooks 36.132097s ; lengths = [10 20]
Test  tooks 37.728289s ; lengths = [20 40]
Test  tooks 1m24.975048s ; lengths = [50 100]

Stage tooks 4m18.989238s ; lengths = [1 2 5 10 20 50], coeffs = [1 2]
----------------------------------------------------------------

Test  tooks 40.287724s ; lengths = [1 10 2 5]
Test  tooks 46.271844s ; lengths = [2 20 4 10]
Test  tooks 1m23.458881s ; lengths = [5 50 10 25]
Test  tooks 1m35.810821s ; lengths = [10 100 20 50]

Stage tooks 4m25.82927s ; lengths = [1 2 5 10], coeffs = [1 10 2 5]
----------------------------------------------------------------

Pack  tooks 12m50.083926s ; repeat = 100000000, count = 1
================================================================

Test  tooks  4.132898s ; lengths = [1]
Test  tooks  4.618395s ; lengths = [2]
Test  tooks  7.672707s ; lengths = [5]
Test  tooks  6.758672s ; lengths = [10]
Test  tooks 11.074239s ; lengths = [20]
Test  tooks 15.240187s ; lengths = [50]
Test  tooks 22.462879s ; lengths = [100]

Stage tooks 1m11.959977s ; lengths = [1 2 5 10 20 50 100], coeffs = [1]
----------------------------------------------------------------

Test  tooks    8.6036s ; lengths = [1 2]
Test  tooks  11.83485s ; lengths = [2 4]
Test  tooks 13.555799s ; lengths = [5 10]
Test  tooks 16.957993s ; lengths = [10 20]
Test  tooks 24.655291s ; lengths = [20 40]
Test  tooks 33.061218s ; lengths = [50 100]

Stage tooks 1m48.668751s ; lengths = [1 2 5 10 20 50], coeffs = [1 2]
----------------------------------------------------------------

Test  tooks 20.386873s ; lengths = [1 10 2 5]
Test  tooks 26.225261s ; lengths = [2 20 4 10]
Test  tooks 32.124838s ; lengths = [5 50 10 25]
Test  tooks 44.610854s ; lengths = [10 100 20 50]

Stage tooks 2m3.347826s ; lengths = [1 2 5 10], coeffs = [1 10 2 5]
----------------------------------------------------------------

Pack  tooks 5m3.976554s ; repeat = 1000000, count = 100
================================================================

Test  tooks  3.610043s ; lengths = [1]
Test  tooks  3.783192s ; lengths = [2]
Test  tooks  6.228974s ; lengths = [5]
Test  tooks  4.414917s ; lengths = [10]
Test  tooks  7.757759s ; lengths = [20]
Test  tooks  8.797396s ; lengths = [50]
Test  tooks 13.938948s ; lengths = [100]

Stage tooks 48.531229s ; lengths = [1 2 5 10 20 50 100], coeffs = [1]
----------------------------------------------------------------

Test  tooks  7.076171s ; lengths = [1 2]
Test  tooks   9.64017s ; lengths = [2 4]
Test  tooks 11.225904s ; lengths = [5 10]
Test  tooks 11.516043s ; lengths = [10 20]
Test  tooks 14.468607s ; lengths = [20 40]
Test  tooks 21.396143s ; lengths = [50 100]

Stage tooks 1m15.323038s ; lengths = [1 2 5 10 20 50], coeffs = [1 2]
----------------------------------------------------------------

Test  tooks 17.797103s ; lengths = [1 10 2 5]
Test  tooks 21.248294s ; lengths = [2 20 4 10]
Test  tooks  23.63996s ; lengths = [5 50 10 25]
Test  tooks 30.876959s ; lengths = [10 100 20 50]

Stage tooks 1m33.562316s ; lengths = [1 2 5 10], coeffs = [1 10 2 5]
----------------------------------------------------------------

Pack  tooks 3m37.416583s ; repeat = 10000, count = 10000
================================================================

Test  tooks  3.590394s ; lengths = [1]
Test  tooks  3.508755s ; lengths = [2]
Test  tooks  5.977439s ; lengths = [5]
Test  tooks   4.22723s ; lengths = [10]
Test  tooks  6.710774s ; lengths = [20]
Test  tooks  6.862576s ; lengths = [50]
Test  tooks  10.81772s ; lengths = [100]

Stage tooks 41.694888s ; lengths = [1 2 5 10 20 50 100], coeffs = [1]
----------------------------------------------------------------

Test  tooks  6.787661s ; lengths = [1 2]
Test  tooks  9.180565s ; lengths = [2 4]
Test  tooks  9.700645s ; lengths = [5 10]
Test  tooks 10.847483s ; lengths = [10 20]
Test  tooks 13.291592s ; lengths = [20 40]
Test  tooks 26.670158s ; lengths = [50 100]

Stage tooks 1m16.478104s ; lengths = [1 2 5 10 20 50], coeffs = [1 2]
----------------------------------------------------------------

Test  tooks 17.236759s ; lengths = [1 10 2 5]
Test  tooks 19.638419s ; lengths = [2 20 4 10]
Test  tooks 20.076024s ; lengths = [5 50 10 25]
Test  tooks 1m9.164084s ; lengths = [10 100 20 50]

Stage tooks 2m6.115286s ; lengths = [1 2 5 10], coeffs = [1 10 2 5]
----------------------------------------------------------------

Pack  tooks 4m4.288278s ; repeat = 100, count = 1000000
================================================================

Total tooks 25m35.765341s ;


Код

Проц:
Core i5   2,5 GHz
Number of Processors: 1
Total Number of Cores: 2
L2 Cache (per Core): 256 KB
L3 Cache: 3 MB

Память 2 планки по:   2 GB   DDR3   1333 MHz

Хуже всего почему-то первый тест проходит. Причем значительно хуже остальных =/

Это сообщение отредактировал(а) k0rvin - 12.5.2013, 21:29


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Akella
Дата 12.5.2013, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Код

function TForm1.Test1(Cycles,Count:Integer;Lengths:TArray<Integer>): Integer;
var Res:string;
    i,j,k:Integer;
    Strings:TArray<String>;
begin
Result:=GetTickCount;
SetLength(Strings,Length(Lengths));
for i:=0 to High(Strings) do Strings[i]:=StringOfChar('a',Lengths[i]);
for i:=0 to Cycles-1 do
  begin
  Res:='';
  for j:=0 to Count-1 do
    for k:=0 to Length(Strings)-1 do
      Res:=Res+Strings[k]
  end;
Result:=GetTickCount-Result;
end;


Цитата
дрюкает обе версии дотнета (возможно, не на всех сценариях - не ждал конца тестов)

PM MAIL   Вверх
Beltar
Дата 12.5.2013, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Это логично, но тогда надо и в .NET через конкатенацию делать. Собственно смысл тестирования-то в выполнении одинакового кода, а не реализаций, а с этим проблема.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Akella
Дата 12.5.2013, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Ну делайте, в чем проблема?
PM MAIL   Вверх
Akella
Дата 13.5.2013, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



PM MAIL   Вверх
Beltar
Дата 13.5.2013, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Ну так это Атари надо заставить меня полюбить шарп.

По поводу for на while, то написано на Delphi Kingdom, что это из-за бага из D7 Upd1, который вроде как заявлено, что прибили в 2005, но в 2006 все равно торчит. Дальше не знаю, но я сегодня вот смотрел асмовый код теста выше, сравнивал, что генерят Delphi и Билдер, цикл там реализован вполне себе очевидно, инкремент, сравнение с пределом, переход.

А сейчас я буду вас смешить, в общем берем мой тестик на перемножение\деление, переделываем его в C#:

Код

        private void button1_Click(object sender, EventArgs e)
        {
            ulong t;
            double a, b = 1.0000001;
            a = b;
            bool o=true;
            Stopwatch _time = new Stopwatch();
            _time.Start();
                 for (t = 1; t < 1000000000; t++)
            {
                if (o) { a = a * b; }
                else { a = a / b; }
                o = !o;
            }
            _time.Stop();
            label1.Text = _time.ElapsedMilliseconds.ToString();
            //label2.Text = a.ToString();
        }


Запускаем его не под отладчиком, оптимизация включена, предпочить 32-бит, впрочем, битность не влияет, итог супер, 2.5 сек. Сделаем одно маленькое изменение, раскомментируем  //label2.Text = a.ToString(); Запускаем снова и результат 7.1 сек! Получается, что студия просто надула нас, выбросив часть работы, причем я даже не понимаю, какую именно часть, что-то же она 2,5 сек. делала. Кстати, билдер на вычисление в пустоту тоже реагирует неадекватно. Что касается Delphi XE3, то есть подозрение на ошибку в 32-хбитном компиляторе, т. к. Debug-версия при запуске без отладчика выдает значение а весьма далекое от 1.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Athari
Дата 13.5.2013, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@Beltar

Цитата
Получается, что студия просто надула нас, выбросив часть работы, причем я даже не понимаю, какую именно часть, что-то же она 2,5 сек. делала.

Тебе надо привыкать к нормальным компиляторам -- они выкидывают ненужный код. Обычно сишные компиляторы очень хорошо с этим справляются. 2.5 секунды, видимо, булево поле дёргалось. Если поэкспериментировать с какими-нибудь интеловскими плюсовыми компиляторами, то цикл может быть вообще выкинут, даже если значение используется (значение можно предсказать, не прогоняя цикл).

Добавлено через 5 минут и 4 секунды
@Akella

Цитата
дрюкает обе версии дотнета (возможно, не на всех сценариях - не ждал конца тестов)

На первых тестах конкатенация без билдера будет рулить, вопросов нет. На последних тестах будет жуткая печаль, потому что для слияния миллиона строк понадобится мусора на сумму арифмитеческой прогрессии от одного до миллиона -- смерть для любого менеджера памяти.
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
Beltar
Дата 13.5.2013, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Логично блин, но в тестах неприемлемо. Хотя и логичность можно оспорить, если код не вызывается, или его результат never used, то это надо не код оптимизировать, а программиста, т. к. код явно неправильный. Кстати, сразу встает вопрос о предыдущем тесте с матрицами, где никакого вывода этих матриц не делалось, но дебажные версии .NET работали мегатормозно, ускоряясь в разы в релизе, что у Delphi с Лазарусом не наблюдалось. Пока получается, что в 64-хбитном матане .NET не быстрее 32-хбитного билдера и вчистую сливает даже Delphi 64 тормозной по сравнению с LLVM нового билдера.
Кстати, Лазарус на умножении\делении показал катастрофическое снижение скорости при включеной оптимизации, без нее же ЕМНИП 7.5 сек. Вообще я уже слышал такой совет, чтобы оптимизацию не включать, повод задуматься, или использовать директивы компилятора для тормозных мест по фактическому тестированию.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
serger
Дата 13.5.2013, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 0
Всего: 5



Цитата(Beltar @  13.5.2013,  08:28 Найти цитируемый пост)
Логично блин, но в тестах неприемлемо. Хотя и логичность можно оспорить, если код не вызывается, или его результат never used, то это надо не код оптимизировать, а программиста, т. к. код явно неправильный. 

warning`и же есть. Сообщения компилятора, то бишь.

Добавлено через 1 минуту и 9 секунд
Ну и куча решений проверки качества кода. (Особенно актуально для С++).
Кстати, грит о самом языку очень красноречиво. ;)


--------------------
упс!
PM MAIL WWW Skype GTalk Jabber   Вверх
Akella
  Дата 13.5.2013, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Что-то в web`е на firemonkey замутили http://www.cybelesoft.com/webfmx/ 
PM MAIL   Вверх
LSD
Дата 13.5.2013, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 9
Всего: 538



Цитата(Beltar @  12.5.2013,  19:02 Найти цитируемый пост)
специально для глупого Атари


M
LSD
Beltar, если ты не можешь удержаться от того чтобы оскорблять своих оппонентов, то просто не заходи в эту тему. А если не можешь сам сдержаться от того чтобы не заходить сюда, то я сделаю это за тебя.



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
fd00ch
Дата 13.5.2013, 14:10 (ссылка) |   (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 28.6.2006

Репутация: нет
Всего: нет



Цитата(Athari @ 13.5.2013,  03:16)
Цитата
дрюкает обе версии дотнета (возможно, не на всех сценариях - не ждал конца тестов)
На первых тестах конкатенация без билдера будет рулить, вопросов нет. На последних тестах будет жуткая печаль, потому что для слияния миллиона строк понадобится мусора на сумму арифмитеческой прогрессии от одного до миллиона -- смерть для любого менеджера памяти.
FastMM неспроста свое название получил, будет дрюкать и на последних тестах

Вот результаты оригинального Delphi-кода (медленнее, чем на инфографике в "стартовом" посте)
Код
Начало теста Repeat=100000000 Count=1 Длины строк:  1 Результат: 16505 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  2 Результат: 16567 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  5 Результат: 16755 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  10 Результат: 17082 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  20 Результат: 24320 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  50 Результат: 25881 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  100 Результат: 26894 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  1 2 Результат: 24118 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  2 4 Результат: 24196 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  5 10 Результат: 22058 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  10 20 Результат: 29609 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  20 40 Результат: 38049 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  50 100 Результат: 40217 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  1 10 2 5 Результат: 41714 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  2 20 4 10 Результат: 51824 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  5 50 10 25 Результат: 41995 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  10 100 20 50 Результат: 46582 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  1 Результат: 6927 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  2 Результат: 7067 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  5 Результат: 7316 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  10 Результат: 8221 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  20 Результат: 8143 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  50 Результат: 9579 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  100 Результат: 12090 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  1 2 Результат: 14227 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  2 4 Результат: 14602 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  5 10 Результат: 13588 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  10 20 Результат: 13962 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  20 40 Результат: 15194 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  50 100 Результат: 20343 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  1 10 2 5 Результат: 25117 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  2 20 4 10 Результат: 26239 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  5 50 10 25 Результат: 27425 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  10 100 20 50 Результат: 31138 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  1 Результат: 6786 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  2 Результат: 6801 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  5 Результат: 6896 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  10 Результат: 7909 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  20 Результат: 9157 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  50 Результат: 15663 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  100 Результат: 27549 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  1 2 Результат: 13666 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  2 4 Результат: 13853 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  5 10 Результат: 14695 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  10 20 Результат: 17816 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  20 40 Результат: 24539 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  50 100 Результат: 34944 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  1 10 2 5 Результат: 25974 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  2 20 4 10 Результат: 30358 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  5 50 10 25 Результат: 34507 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  10 100 20 50 Результат: 50419 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  1 Результат: 6833 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  2 Результат: 7129 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  5 Результат: 8112 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  10 Результат: 10655 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  20 Результат: 12917 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  50 Результат: 17098 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  100 Результат: 26769 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  1 2 Результат: 14227 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  2 4 Результат: 15023 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  5 10 Результат: 15772 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  10 20 Результат: 18642 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  20 40 Результат: 24461 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  50 100 Результат: 48485 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  1 10 2 5 Результат: 29047 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  2 20 4 10 Результат: 35646 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  5 50 10 25 Результат: 43477 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  10 100 20 50 Результат: 63258 мс

Вот результаты конкатенации с нормальным циклом и без стрингбилдера (зачастую быстрее, чем у дотнетов на инфографике)
Код
Начало теста Repeat=100000000 Count=1 Длины строк:  1 Результат: 3401 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  2 Результат: 3385 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  5 Результат: 3401 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  10 Результат: 3401 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  20 Результат: 3385 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  50 Результат: 3401 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  100 Результат: 3385 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  1 2 Результат: 6053 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  2 4 Результат: 6068 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  5 10 Результат: 6271 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  10 20 Результат: 7457 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  20 40 Результат: 8455 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  50 100 Результат: 9657 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  1 10 2 5 Результат: 10109 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  2 20 4 10 Результат: 10202 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  5 50 10 25 Результат: 15928 мс
Начало теста Repeat=100000000 Count=1 Длины строк:  10 100 20 50 Результат: 18065 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  1 Результат: 1575 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  2 Результат: 1670 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  5 Результат: 1856 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  10 Результат: 2013 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  20 Результат: 2433 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  50 Результат: 2917 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  100 Результат: 3713 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  1 2 Результат: 4836 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  2 4 Результат: 4961 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  5 10 Результат: 3526 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  10 20 Результат: 3915 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  20 40 Результат: 4587 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  50 100 Результат: 8393 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  1 10 2 5 Результат: 8611 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  2 20 4 10 Результат: 8471 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  5 50 10 25 Результат: 8221 мс
Начало теста Repeat=1000000 Count=100 Длины строк:  10 100 20 50 Результат: 9625 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  1 Результат: 1654 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  2 Результат: 1607 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  5 Результат: 1684 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  10 Результат: 1670 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  20 Результат: 1981 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  50 Результат: 6255 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  100 Результат: 11326 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  1 2 Результат: 4758 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  2 4 Результат: 4867 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  5 10 Результат: 3167 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  10 20 Результат: 6615 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  20 40 Результат: 11606 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  50 100 Результат: 22589 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  1 10 2 5 Результат: 8019 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  2 20 4 10 Результат: 11731 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  5 50 10 25 Результат: 17285 мс
Начало теста Repeat=10000 Count=10000 Длины строк:  10 100 20 50 Результат: 28751 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  1 Результат: 1872 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  2 Результат: 2012 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  5 Результат: 2543 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  10 Результат: 3198 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  20 Результат: 5460 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  50 Результат: 9999 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  100 Результат: 22449 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  1 2 Результат: 5414 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  2 4 Результат: 5943 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  5 10 Результат: 5398 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  10 20 Результат: 7753 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  20 40 Результат: 19485 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  50 100 Результат: 37596 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  1 10 2 5 Результат: 11700 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  2 20 4 10 Результат: 15428 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  5 50 10 25 Результат: 22012 мс
Начало теста Repeat=100 Count=1000000 Длины строк:  10 100 20 50 Результат: 46270 мс


Хотелось бы заметить, что вменяемый delphi-программер не станет использовать стрингбилдер для складывания тупо строк. А умный - не станет использовать в сильно загруженном месте цикл for in, тем более - для строк.
Поэтому для меня тест выглядит как-то так: "Посоны, мы с корешом нашли 2 класса с одинаковыми названиями в NET и Delphi. Похоже, делают они то же самое и мы решили их сравнить. Так... копирнем типичный быдлокод из нета в делфи, ого! скомпилировалось. Запустим... Ну и тормоза. Delphi сосет!!1"

Если есть желание потешить свое ЧСВ - сравнивать надо более реальные вещи, а не тупое складывание строк с помощью подкапотных классов или бесполезное деление чисел. При этом писать оптимальный код для каждой платформы (а тут мозги будут нужны, ага). Например, тест целочисленной арифметики: взять 10 mpx фотку (24/32 бита или даже 8/16) и вручную рассчитать гистограмму для всех цветов по ней (выбросив из замеров загрузку и распаковку картиники в массив битов). Тест вещественных чисел - ту же картинку повернуть на некратный угол, скажем, 23.83 градуса. Тест строк - разобрать 100 МБ файл по строкам без применения стандартных классов типа StringList (по той простой причине, что в .NET эти классы вполне могут быть написаны не на дотнете))).

А так - сравнили вылизанный стрингбилдер из .NET и аналогичное убожество из Delphi. То, что последний - сплошной тормоз, никто и не спорит (интереса ради попробуйте в оригинальном коде добавлять в билдер пустую строку на каждой итерации - время снизится несильно))). Как и с тем, что можно написать нормальный. Хотя, зачем?..

Это сообщение отредактировал(а) fd00ch - 13.5.2013, 14:16
PM MAIL   Вверх
Athari
Дата 13.5.2013, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.6.2007
Где: Казань, Россия

Репутация: 1
Всего: 1



@fd00ch

Цитата
Вот результаты оригинального Delphi-кода (медленнее, чем на инфографике в "стартовом" посте)

Медленнее на маленьких строках. На больших -- быстрее. Любопытно.

Проц, память? Версия дельфи, FastMM? Расход памяти (Max Private Bytes)?

Цитата
Вот результаты конкатенации с нормальным циклом и без стрингбилдера (зачастую быстрее, чем у дотнетов на инфографике)

Создание билдера и append заменены на присваивание пустой строки и оператор сложения? (Вообще, с нормальным форком на гитхабе было бы удобнее.)

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

Цитата
А умный - не станет использовать в сильно загруженном месте цикл for in, тем более - для строк.

for in как-то медленно реализован и не оптимизируется что ли? Насчёт шарпа не скажу, а в тех же плюсах всякие итераторы и прочее из STL работают с абсолютно такой же скоростью, как и голые указатели (при нормальных компиляторах и включенной оптимизации).

Цитата
Поэтому для меня тест выглядит как-то так: "Посоны, мы с корешом нашли 2 класса с одинаковыми названиями в NET и Delphi. Похоже, делают они то же самое и мы решили их сравнить.

Тащемта, реализация "старого" билдера дотнета и современного билдера дельфи -- идентичны. Если посмотреть код, то там практически копипаста.

Цитата
При этом писать оптимальный код для каждой платформы (а тут мозги будут нужны, ага).

На стадии оптимизации кода возникают интересные нюансы. Например, в шарпе есть возможность писать "небезопасный" код на указателях, в котором не будет проверок на выход за границу массива и прочего. Если понадобится оптимальный код, причём непременно на шарпе, то можно опуститься до указателей. Это будет "честно"?

(Правильным решением в такой ситуации обычно будет подключение библиотеки, написанной на си/плюсах, конечно, но не будем об этом, потому что то же самое верно и для дельфи. Хорошо оптимизированный код на плюсах порвёт любой другой язык как тузик грелку. Правда программистов для написания кода такого качества днём с огнём не сыщешь, и стоят они заоблачно...)

Цитата
без применения стандартных классов типа StringList (по той простой причине, что в .NET эти классы вполне могут быть написаны не на дотнете)

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

Цитата
интереса ради попробуйте в оригинальном коде добавлять в билдер пустую строку на каждой итерации - время снизится несильно

Белтар уже "писал" конкатенацию простых строк, "натестировались". smile 
PM MAIL WWW ICQ Skype Jabber AOL YIM MSN   Вверх
fd00ch
Дата 13.5.2013, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 28.6.2006

Репутация: нет
Всего: нет



Код привел выше Akella - это мой вариант. Вот чуть более быстрый:
Код
 var
  Res:string;
  i,j,k,Len:Integer;
  Strings:TArray<String>;
 begin
  Result:=GetTickCount;

  Len:=Length(Lengths);
  SetLength(Strings,Len);
  for i:=0 to Len-1
   do   Strings[i]:=StringOfChar('a',Lengths[i]);

  for i:=0 to Cycles-1
   do   begin
         Res:='';
         for j:=0 to Count-1
          do   for k:=0 to Len-1
                do   Res:=Res+Strings[k]
        end;

  Result:=GetTickCount-Result
 end;


Цитата
Проц, память? Версия дельфи, FastMM? Расход памяти (Max Private Bytes)?
i5-2500, мозги какой-то лоукост. D2010, FastMM оттуда же. Расход не мерил. Тот "перерасход" на 99% связан с честным созданием новой строки в Delphi (с копированием в нее буфера) и финтом .NET, который тупо возвращает буфер

Цитата
Если посмотреть код, то там практически копипаста.
кидай этот код, посмотрим

Цитата
На стадии оптимизации кода возникают интересные нюансы. Например, в шарпе есть возможность писать "небезопасный" код на указателях, в котором не будет проверок на выход за границу массива и прочего. Если понадобится оптимальный код, причём непременно на шарпе, то можно опуститься до указателей. Это будет "честно"?
Обсуждаемый вопрос. Я не в курсе, что такое unsafe код - значит, может не работать на другой платформе, под которой фреймворка все равно нету?))

Цитата
Во-первых, в коллекциях нативного кода, вроде, нет
Ну тогда не надо в конце кричать "смотрите, как наш управляемый код с JIT, GC и прочими умными буквами уделывает ваш убогий нативный", т.к. управляемый код там, по факту, и не работает

Цитата
Качество стандартной библиотеки определяет, как хорошо будет работать код в реальных приложниях.
Качество стандартной библиотеки определяет, какую библиотеку грамотный спец будет использовать в критичных к скорости проектах)) К сравнению языков она отношения не имеет, тем более, что написана не на нативном языке.

Цитата
Белтар уже "писал" конкатенацию простых строк, "натестировались". smile
прочитай процитированный кусок еще раз, ты его не понял
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1189 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.