vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2024-12-08 10:21 pm
Entry tags:

Бенчмарки std::set и std::map

Задумался я соорудить простой тест для сравнения скорости процессоров. Чтобы чуть более практичный, чем Dhrystone. И сдаётся мне, что красно-черные деревья ровно то, что надо. Многие системные программы, скажем компиляторы, занимаются примерно тем же: выполняют разные манипуляции над графами. В языке Си++ на сбалансированных деревьях построены стандартные классы std::set и std::map. Cкорость их работы и будем замерять. А в качестве генератора данных приспособим лоренцов аттрактор.

Сделал я такие тестики: set.cpp и map.cpp. Тесты создают 2 миллиона записей, а затем эти записи по одной удаляют. Общий размер данных выходит порядка 100 мегабайт. Процесс однопоточный, то есть задействуется только одно ядро процессора. Тест выдаёт две величины: скорость (количество записей в миллисекунду) и занятую память (в байтах на одну запись).

Прогнал я эти тесты на имевшихся под рукой компьютерах:
  • макбук на процессоре Apple M2 - MacOS, clang
  • мак мини на процессоре Apple M1 - MacOS, clang
  • iMac на процессоре Intel i9 - MacOS, clang
  • ноутбук Lenovo на процессоре Intel i7 - Ubuntu, gcc
  • Raspberry Py 5 - Ubuntu, gcc
  • Raspberry Py 4 - FreeBSD, clang
  • олинуксино на процессоре ARM32 - Debian, gcc
Результаты собраны в таблицу.
                                            --------Rate--------    -------Memory-------
Processor, Computer                         std::set    std::map    std::set    std::map
----------------------------------------------------------------------------------------
Apple M2 Max (12) @ 3.70 GHz                3856.1      2997.5      32.7        48.7
MacBook Pro (16-inch, 2023)
----------------------------------------------------------------------------------------
Apple M1 (8) @ 3.20 GHz                     2608.3      2091.6      32.7        48.7
Mac mini (M1, 2020)
----------------------------------------------------------------------------------------
Intel Core i9-9900K (16) @ 3.60 GHz         2302.4      1953.3      32.4        48.5
iMac (Retina 5K, 27-inch, 2019)
----------------------------------------------------------------------------------------
Intel Core i7-8750H (12) @ 4.10 GHz         1656.6      1654.2      49.8        49.8
Lenovo ThinkPad P1
----------------------------------------------------------------------------------------
Cortex-A76 (4) @ 2.40 GHz                   775.7       788.1       49.6        49.6
Raspberry Pi 5 Model B Rev 1.0
----------------------------------------------------------------------------------------
ARM Cortex-A72 r0p3 (4) @ 1.5 GHz           527.7       490.3       34.7        50.3
Raspberry Pi 4 Model B Rev 1.2
----------------------------------------------------------------------------------------
Allwinner sun7i (A20) Family (2) @ 960MHz   149.7       141.3       25.2        33.1
Olimex A20-OLinuXino-LIME2
ircicq: (Default)

[personal profile] ircicq 2024-12-09 07:54 am (UTC)(link)
Замерил на Apple M3 Max.

Set:
====
Last 8.42386 8.03421 27.4317
Sum 292628
Elapsed time: 0.487 seconds
Resident memory: 65.356 Mbytes
Records per millisecond: 4104.7
Bytes per record: 32.7

Map:
====
Last 8.42386 8.03421 27.4317
Sum 292628
Elapsed time: 0.638 seconds
Resident memory: 97.468 Mbytes
Records per millisecond: 3133.6
Bytes per record: 48.7

[personal profile] makcuk 2024-12-10 01:37 am (UTC)(link)
Може буде цікаво як новенький М4 відпрацьовує

-------------------
OS: macOS 15.1 24B2082 arm64
Host: Mac16,7
Kernel: 24.1.0
Uptime: 7 days, 11 hours, 5 mins
Packages: 308 (brew)
Shell: zsh 5.9
Resolution: 1728x1117, 3440x1440
DE: Aqua
WM: Quartz Compositor
WM Theme: Blue (Light)
Terminal: iTerm2
Terminal Font: Monaco 12
CPU: Apple M4 Pro
GPU: Apple M4 Pro
Memory: 8079MiB / 49152MiB

====
Last 8.42386 8.03421 27.4317
Sum 292628
Elapsed time: 0.546 seconds
Resident memory: 65.438 Mbytes
Records per millisecond: 3659.8
Bytes per record: 32.7
====
Last 8.42386 8.03421 27.4317
Sum 292628
Elapsed time: 0.528 seconds
Resident memory: 65.454 Mbytes
Records per millisecond: 3790.5
Bytes per record: 32.7
====
Last 8.42386 8.03421 27.4317
Sum 292628
Elapsed time: 0.585 seconds
Resident memory: 65.421 Mbytes
Records per millisecond: 3417.0
Bytes per record: 32.7
====
Last 8.42386 8.03421 27.4317
Sum 292628
Elapsed time: 0.759 seconds
Resident memory: 97.567 Mbytes
Records per millisecond: 2633.9
Bytes per record: 48.8
====
Last 8.42386 8.03421 27.4317
Sum 292628
Elapsed time: 0.722 seconds
Resident memory: 97.550 Mbytes
Records per millisecond: 2769.3
Bytes per record: 48.8
====
Last 8.42386 8.03421 27.4317
Sum 292628
Elapsed time: 0.701 seconds
Resident memory: 97.550 Mbytes
Records per millisecond: 2854.5
Bytes per record: 48.8
kondybas: (Default)

[personal profile] kondybas 2024-12-09 09:28 am (UTC)(link)
Забавно, что четвертая пишка, официально в 2.5 раза менее шустрая, чем пятая, в вашем тесте отстает только в полтора раза. Интересно, чья єто заслуга - FreeBSD или шланга?

kondybas: (Default)

[personal profile] kondybas 2024-12-09 10:03 am (UTC)(link)
Вопрос не так, чтоб сильно животрепещущий :) Просто глазом зацепился за цифру.
kondybas: (Default)

[personal profile] kondybas 2024-12-09 12:29 pm (UTC)(link)
У пятой пишки память, вроде, впятеро шустрее, чем у четвертой, если тест упирает на процессор, то вполне может біть, что єффект от шустрой памяти снижается.

[personal profile] sassa_nf 2024-12-17 08:33 am (UTC)(link)
А чому від Intel Core i7-8750H вниз швидкодія обох функцій однакова?

До того ж, здається, що код має бути ідентичним до того, що на Intel i9 рядком вище.
Edited 2024-12-17 08:37 (UTC)

[personal profile] sassa_nf 2024-12-17 01:08 pm (UTC)(link)
Добре (хоча не дуже зрозуміло,
як воно впливає). Але тоді що цей бенчмарк вимірює?