до 15 раз быстрее вычисления C ++ против C # это законно?

это моя первая попытка создать собственный код на C ++,
затем вызывая функции из c #, чтобы проверить накладные расходы, о которых я слышал при вводе / вызове кода.
тест представляет собой простое математическое вычисление, сначала один прогон, а затем 10 000 итераций в цикле.

class Program
{
[DllImport("ExportTest.dll", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern void doWarmUp();
[DllImport("ExportTest.dll", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern int doOne();
[DllImport("ExportTest.dll", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
public static extern int doLongOne();

static void Main(string[] args)
{
doWarmUp();
Stopwatch sw = new Stopwatch();
int test;

sw.Reset();
sw.Start();
test = csdoOne();
sw.Stop();
Console.WriteLine("Res CsdoOne:{0} ", sw.ElapsedTicks);
sw.Reset();
sw.Start();
test = doOne();
sw.Stop();
Console.WriteLine("Res C++ doOne :{0} ", sw.ElapsedTicks);sw.Reset();
sw.Start();
test = doLongOne();
sw.Stop();
Console.WriteLine("Res C++ doLongOne:{0}\tTics: {1} ", test, sw.ElapsedTicks);
sw.Reset();
sw.Start();
test = csdoLongOne();
sw.Stop();
Console.WriteLine("Res C# doLongOne:{0}\tTics: {1} ", test, sw.ElapsedTicks);
Console.Read();
}
static int csdoOne()
{
int res;
res  = 5 * 4;
return res;
}
static int csdoLongOne()
{
int r1, r2;
r1 = 0; r2 = 0;
for (int i = 0; i < 10500; i++)
{

r1 = (5 * 4);
r2 = i * 2;
r1 += r2;
}
return r2;
}
}

если будет интересно увидеть код с ++ я тоже выложу,
я не сделал этого, потому что это на самом деле один и тот же код в обеих функциях
функция прогрева просто void doWarmUp(){ return;}, так как у меня есть заметки, что только первый звонок имеет какие-либо накладные расходы.

результаты, представленные на графике, удивительны, так как мне действительно нравится c #

Res Cs doOne:  4
Res C++ doOne: 17
Res c++ doLongOne: 21018        Tics: 30
Res C#  doLongOne: 21018        Tics: 446

это всего лишь простая математика … я делаю что-то не так?

1

Решение

Ваше тестирование ошибочно. Ты звонишь очень Короткий метод только один раз, практически нечего измерить. Колебания (изменчивость) в измерениях будут выше, чем само время. Это делает недействительным ваш первый метод синхронизации.

Вам следует позвонить doOne в миллиард раз и разделите результат на миллиард, на поплавки (не целые).

Не уверен, как объяснить второй метод времени. Возможно, вы столкнулись с одним из тех редких моментов, когда .Net собирает мусор прямо в середине тестирования, добавляя значительное количество времени. Это можно легко проверить. Запустите тест несколько раз. Если бы это было так, большинство времени было бы близко друг к другу с горсткой выбросов.

Также второй метод также слишком короткий, чтобы его можно было измерить без петли. 10 000 итераций трудно измерить на процессоре, который выполняет миллиарды инструкций в секунду.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]