03 мая 2020

Первые тесты производительности FastMM 5

    По информации автора менеджер памяти FastMM производительность приложений, использующих FastMM 5-й версии выше, чем у использующих FastMM версии 4.992 в однопоточных тестах на 15%, а в многопоточных тестах на 30%. Так ли это? Давайте проверим и сравним скорость работы FastMM 4, который используется в Delphi 10.3, и FastMM 5.0.
    Сразу хочу предупредить – я понятия не имею, как тестировать менеджеры памяти. Поэтому мой тест – это первое, что пришло мне в голову. Большое количество итераций должно хоть немного сглаживать погрешности. Тест состоит из четырех частей:
1. распределяем 10 участков памяти по 10-100 байт, затем увеличиваем их размер до 20-200 байт и высвобождаем память;
2. распределяем 10 участков памяти по 10-100 килобайт, затем увеличиваем их размер до 20-200 килобайт и высвобождаем память;
3. распределяем 10 участков памяти по 10-100 мегабайт и высвобождаем память;
4. проводим конкатенацию строк различного размера.

program MMtest;

{$APPTYPE CONSOLE}

uses
  FastMM5,
  System.Classes,
  System.SysUtils,
  System.Threading,
  System.Diagnostics;

procedure MemoryTest(const iCoeff: Integer);
var
  i, j: Integer;
  p: Array[1..10] of Pointer;
begin
  for i := 1 to 100000 do
    begin
      for j := 1 to 10 do
        p[j] := GetMemory(j * 10 * iCoeff);
      for j := 1 to 10 do
        p[j] := ReallocMemory(p[j], j * 20 * iCoeff);
      for j := 1 to 10 do
        FreeMemory(p[j]);
    end;
end;

procedure MemoryTest2;
var
  i, j: Integer;
  p: Array[1..10] of Pointer;
begin
  for i := 1 to 10000 do
    begin
      for j := 1 to 10 do
        p[j] := GetMemory(j * 10485760);
      for j := 1 to 10 do
        FreeMemory(p[j]);
    end;
end;

function StringTest: String;
var
  i: Integer;
  sTemp: String;
begin
  Result := '';
  sTemp  := '';
  for i := 32 to 132 do
    sTemp := sTemp + Chr(i);
  for i := 1 to 1000 do
    Result := Result + sTemp;
  for i := 1 to 1000 do
    Result := sTemp + Result + sTemp;
end;

var
  sw: TStopwatch;
begin
  FastMM_SetOptimizationStrategy(mmosOptimizeForSpeed);
  // Test #1
  sw := TStopwatch.StartNew;
  MemoryTest(1);
  sw.Stop;
  WriteLn(sw.ElapsedMilliseconds);

  sw := TStopwatch.StartNew;
  TParallel.For(1, 10, procedure (i: integer) begin MemoryTest(1) end);
  sw.Stop;
  WriteLn(sw.ElapsedMilliseconds);

  // Test #2
  sw := TStopwatch.StartNew;
  MemoryTest(1024);
  sw.Stop;
  WriteLn(sw.ElapsedMilliseconds);

  sw := TStopwatch.StartNew;
  TParallel.For(1, 10, procedure (i: integer) begin MemoryTest(1024) end);
  sw.Stop;
  WriteLn(sw.ElapsedMilliseconds);

  // Test #3
  sw := TStopwatch.StartNew;
  MemoryTest2;
  sw.Stop;
  WriteLn(sw.ElapsedMilliseconds);

  sw := TStopwatch.StartNew;
  TParallel.For(1, 10, procedure (i: integer) begin MemoryTest2 end);
  sw.Stop;
  WriteLn(sw.ElapsedMilliseconds);

  // Test #4
  sw := TStopwatch.StartNew;
  StringTest;
  sw.Stop;
  WriteLn(sw.ElapsedMilliseconds);

  sw := TStopwatch.StartNew;
  TParallel.For(1, 10, procedure (i: integer) begin StringTest end);
  sw.Stop;
  WriteLn(sw.ElapsedMilliseconds);
end.

Результаты работы 32-х битного приложения
ТестПотоковFMM4FMM5Дельта%
113336-3-9.09
1033311551178053.44
21450659-209-46.44
103086599852088067.65
3111141910-796-71.45
10143649347501734.93
4199376262.63
10102415187385.25

Результаты работы 64-х битного приложения
ТестПотоковFMM4FMM5Дельта%
112139-18-85.71
10175115851669.48
21344725-381-110.76
101778710240754742.43
3117341867-133-7.67
101840615183322317.51
41129408968.99
101221152106987.55

    Итак, что мы видим? Для однопоточных приложений, если исключить тест со строками, результаты тестов не в пользу 5-й версии. А вот многопоточные версии тестов реально впечатляют. Значит вполне можно подождать несколько недель или месяц, что бы побольше приложений испытали на себе FastMM 5, и включать его в свои проекты. Особенно в многопоточные и те, в которых ведется интенсивная работа со строками.

6 комментариев:

  1. Стоило бы сравнить ещё с форком FastMM4-AVX - также заявляется преимущество для многопоточных приложений.
    А может я и сам сравню на днях. Конечно менеджер памяти это не то, что стоит менять, если всё работает... Но интересно было бы посмотреть )

    ОтветитьУдалить
  2. Погонял тесты. Получил совсем другие данные для теста 2 в 10 потоков. Что в 32, что в 64 бит - для FastMM5 получается больше, чем у FastMM4...
    Могу скинуть свою табличку в гуглдоксе...
    Может код как-то менялся?

    ОтветитьУдалить
  3. 1. Я проводил сравнения с точки зрения человека, который ранее не подключал к проекту FastMM и сравнивал с «FastMM 4, который используется в Delphi 10.3», а это скорее всего не FastMM 4.992 и тем более не ответвление FastMM4-AVX (которое с выходом FastMM 5 потеряло смысл).
    2. Результат возможно, зависит и от версии Delphi (я тестировал на Delphi 10.3.2). Попробуйте поменять количество потоков на 8 или 4.

    ОтветитьУдалить
  4. Я провёл сравнение на 10.3.3 и 10.0 - результаты в этих версиях схожи.
    Код я взял полностью ваш. И у меня на Ryzen 3600 и Ryzen 3700x получаются в целом схожие результаты.
    И самое странное, что во 2м тесте с 10 потоками у меня получается, что FastMM5 не имеет преимущества перед FastMM4. Более того - в 64 битном варианте FastMM4 у меня показал преимущество перед FastMM5.

    ОтветитьУдалить
  5. Я запускал на Core i7-8700 с 32-мя ГБ ОЗУ. Может это дает разницу? Ваши Ryzen будут помощнее.

    Проверьте, вы может не релиз, а дебаг собирали?

    А если убрать FastMM_SetOptimizationStrategy(mmosOptimizeForSpeed), что бы по умолчанию было mmosBalanced? или поставить mmosOptimizeForLowMemoryUsage ?

    "Я провёл сравнение на 10.3.3 и 10.0 - результаты в этих версиях схожи." - возможно разработчики Delphi как взяли FastMM 4, так его и не обновляли (если он вообще обновлялся).

    ОтветитьУдалить
  6. Памяти у меня так же по 32 ГБ. Впрочем, учитывая, что в 32 битном режиме вся эта роскошь недоступна...
    Я проверял именно релиз. И, кстати, разницы с дебагом для этих тестов почти не было.
    Я проверял с оптимизацией по скорости. Но также и в сбалансированном режиме - разницы почти не было.

    А теперь по поводу процессора. К сожалению, настольного интела у меня под рукой нет, но есть мобильный 8265u.
    И вот на мобильном интеле FastMM5 выиграл у стандартного (FastMM4) менеджера памяти в многопоточной версии теста номер 2. При этом в том же тесте, но уже на райзене стандартный менеджер памяти выигрывает почти 3х кратно...
    Интересно будет попробовать на райзене 2600x. Если доберусь до него в ближайшее время...

    ОтветитьУдалить