Блокировка на С# быстрее, чем на С++? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Блокировка на С# быстрее, чем на С++? [закрыто]

Сообщение Anonymous »

Я написал две программы для
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»