Windows, Visual Studio
Intel(R) Core(TM) 12-го поколения i7-12700H, 2300 МГц, 14 ядер, 20 логических процессоров
Один на C#, другой на C++.
Оба предназначены только для циклов с int i и блокировкой, а затем устанавливают глобальное int в счетчик цикла чтобы дать ему чем-нибудь заняться.
Я понимаю...
C++: (Debug) 26,315,789 locks per second (std::mutex)
C++ (Release) Locks per second: 76,923,076 (Added after comments below)
C#: 58,823,529 locks per second ( C# lock(obj) { ... }
C#: 62,073,246 locks per second Release (Added after comments below)
По моему опыту, время блокировки ограничено скоростью памяти, поэтому оно составляет около 20 нс на блокировку.
Таким образом, 50 000 000 в секунду или около того.
Почему C# быстрее, чем C++?
Обновление: после комментариев я повторно запустил режим Release, и цифры стали гораздо понятнее.
До сих пор я думал...
- Компилятор оптимизировал глобальный набор и делал это только после цикла?
- std::mutex не так уж и хорош.
- Автопараллельность в C#? Получается, что 12 потоков на блокировку потока равны 2 000 000 в секунду?
- Какое-то встроенное оптимальное аппаратное обеспечение блокировки? (Нет поездки к памяти туда и обратно?)
Коды
C#
Object obj = new();
int N = 10000000;
Stopwatch sw2 = new Stopwatch();
Console.WriteLine($"Start {N} locks ");
sw2.Start();
for (int i = 0; i < N; i++)
{
lock (obj)
{
foo = N;
}
}
sw2.Stop();
int lps = (int)((double)N / ((double)sw2.ElapsedMilliseconds / 1000.0));
Console.WriteLine($"Done {N} locks in {sw2.ElapsedMilliseconds} ms {lps} locks per second.");
C++
std::cout
Подробнее здесь: https://stackoverflow.com/questions/791 ... arp-than-c
Мобильная версия