У меня есть следующий C# код пытается бенчмарка в режиме выпуска:Медленное исполнение под 64 бит. Возможная ошибка RyuJIT?
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication54
{
class Program
{
static void Main(string[] args)
{
int counter = 0;
var sw = new Stopwatch();
unchecked
{
int sum = 0;
while (true)
{
try
{
if (counter > 20)
throw new Exception("exception");
}
catch
{
}
sw.Restart();
for (int i = 0; i < int.MaxValue; i++)
{
sum += i;
}
counter++;
Console.WriteLine(sw.Elapsed);
}
}
}
}
}
Я на 64-битной машине и VS 2015 установлена. Когда я запускаю код под 32-битным, он запускает каждую итерацию около 0,6 секунды, печатается на консоль. Когда я запускаю его под 64-битным, продолжительность каждой итерации просто переходит на 4 секунды! Я попробовал образец кода на компьютере моих коллег, на котором установлен только VS 2013. Там как 32-битные, так и 64-разрядные версии работают около 0,6 секунды.
В дополнение к этому, если мы просто удалим блок захвата try, он также работает в 0,6 секунды с VS 2015 в 64-разрядной версии.
Это выглядит как серьезная регрессия RyuJIT, когда есть блок catch try. Я прав ?
Ваш компьютер - супер гений! для меня это занимает около 10 секунд на каждой итерации: (и никакой разницы здесь. И 32bit, и 64bit дают такие же результаты. –
@ M.kazem. Я не думаю, что это возможно. Мой компьютер - Surface Pro 3 i7 с U я уверен, что вы запускаете его в режиме Release и Start без отладки? BTW Я пытался использовать 4 разных компьютера. –
Нет, нет. У меня это получилось, потому что вы включили опцию 'Optimize code 'в свойствах решения. Теперь я получаю' 1.3s' для 32bit и '3.9s' для 64 бит. –