Родные скорости C ++ и C ++ / CLI - PullRequest
3 голосов
/ 29 октября 2010

У меня есть вопрос относительно скорости C ++ / CLI и родной скорости C ++. Я написал небольшое тестовое приложение и вижу очень удивительные результаты.

Кажется, что неуправляемый код C ++ / CLI значительно медленнее. В основном я создал два консольных приложения. Одно стандартное консольное приложение win32 и консольное приложение CLR

Вот код, который я сделал для теста. Я сохранил код абсолютно одинаковым во всех версиях теста.

const int NumberOfTests = 10000000;
void GrowBalance(int numberOfYears)
{
 std::cout<<"Called"<<std::endl;

 DWORD startTime = GetTickCount();

 int numberOfRandom = 0;
 for(int i = 0; i < NumberOfTests; i++)
 {
  double dBalance = 10000.0;
  for(int year = 0; year < numberOfYears; year++)
  { 
   dBalance *= 1.05;
   if(dBalance > 20000.00 && dBalance < 22000.00)
   {
    numberOfRandom++;
   }//if
  }//for
 }//for

 DWORD endTime = GetTickCount();

 std::cout<<"Time Elapsed: "<<endTime - startTime<<std::endl;
 std::cout<<"Number of random: "<<numberOfRandom<<std::endl;
}

Выходной управляемый код:

Called
Time Elapsed: 9937
Number of random: 20000000

Вывод управляемого кода с управляемой прагмой (push, off):

Called
Time Elapsed: 24516
Number of random: 20000000

Вывод собственного кода:

Called
Time Elapsed: 2156
Number of random: 20000000

В сети только что позвонил GrowBalance с указанием 90 лет. Довольно простой тест. Есть ли что-то, что я делаю неправильно или я действительно смотрю код, который будет в 4,5 раза медленнее с использованием C ++ / CLI. И я также не понимаю, как отключить управляемый код. Все, что я прочитал, говорит, что это скомпилирует код на родной C ++, но это безумно медленнее. Любая помощь с этим будет очень цениться.

Обновление: Я только что выполнил этот тест в Visual Studio 2005 вместо 2008 года. Соответствие производительности на собственном C ++.

Обновление № 2: Я просто помещаю свой тестовый код в класс вместо одной функции и получаю намного лучшие результаты. Теперь смешанный код преформируется при среднем времени выполнения ~ 5000 мс

Но в 2005 году я вижу гораздо более быстрые результаты. Среднее время работы около ~ 1875 мс. Может быть, я просто буду придерживаться 2005 года для моей разработки CLI. Если у кого-то нет причины, по которой это может происходить.

1 Ответ

3 голосов
/ 07 ноября 2010

Одна вещь, с которой вы можете столкнуться, это то, что для нативного C ++ оптимизации контролируются аргументами командной строки для компилятора, но для управляемого кода оптимизации управляются тем, как вы запускаете приложение (например, если вы запускаете в отладчике, многие оптимизации отключены, даже если вы сделали оптимизированную сборку). Вы вообще не должны запускать тесты производительности "в" Visual Studio.

Собственный компилятор также имеет МНОГО дополнительных оптимизаций. Возможно, он даже достаточно умен, чтобы выяснить, что dBalance строго увеличивается, и продолжение внутреннего цикла for, если dBalance > 22000.0 не имеет видимых побочных эффектов.

Что происходит во всех трех случаях, если вы измените этот внутренний цикл for следующим образом (он будет делать только 17 итераций, пока numberOfYears >= 17)?

  double dBalance = 10000.0;
  for(int year = 0; year < numberOfYears && dBalance < 22000.0; year++)
  { 
   dBalance *= 1.05;
   if(dBalance > 20000.0)
   {
    numberOfRandom++;
   }//if
  }//for

Как насчет:

if (numberOfYears > 14) {
  double dBalance = 19799.315994393973883056640625;
  for(int year = 14; year < numberOfYears && dBalance < 22000.0; year++)
  { 
   dBalance *= 1.05;
   numberOfRandom++;
  }//for
}

А как насчет:

if (numberOfYears > 14) {
  numberOfRandom += (numberOfYears >= 17)? 3: numberOfYears - 14;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...