Почему сборка в VCC 2003 занимает так много времени? - PullRequest
3 голосов
/ 12 марта 2009

Моей команде нужен «генератор квазислучайных чисел Соболя» - обычный ГСЧ, который славится хорошим качеством результатов и скоростью работы. Я нашел то, что похоже на простую реализацию C в сети . Дома я смог скомпилировать его практически мгновенно, используя мой компилятор Linux GCC.

На следующий день я попробовал это на работе: если я компилирую в Visual Studio в режиме отладки, это займет около 1 минуты. Если бы я скомпилировал его в режиме релиза , это заняло бы около 40 минут.

Почему?

Я знаю, что режим "релиза" запускает некоторую оптимизацию компилятора ... но как же файл может так долго оптимизироваться? В основном это комментарии и статические данные. Вряд ли стоит что-то оптимизировать.

Ни один из этих компьютеров не работает особенно медленно, и в любом случае я знаю, что время компиляции одинаково для разных компьютеров Windows. Я также слышал, что более новые версии Visual Studio имеют более быстрое время компиляции, однако сейчас мы застряли с Visual Studio.Net 2003. Компиляция на GCC (та, что входит в Ubuntu 8.04) всегда занимает микросекунды.

Ответы [ 3 ]

2 голосов
/ 12 марта 2009

Если честно, я не совсем уверен, что коды так хороши. В нем неприятный запах. А именно эта функция:

unsigned int i4_xor ( unsigned int i, unsigned int j )

//****************************************************************************80
//
//  Purpose:
//
//    I4_XOR calculates the exclusive OR of two integers.
//
//  Modified:
//
//    16 February 2005
//
//  Author:
//
//   John Burkardt
//
//  Parameters:
//
//    Input, unsigned int I, J, two values whose exclusive OR is needed.
//
//    Output, unsigned int I4_XOR, the exclusive OR of I and J.
//
{
  unsigned int i2;
  unsigned int j2;
  unsigned int k;
  unsigned int l;

  k = 0;
  l = 1;

  while ( i != 0 || j != 0 )
  {
    i2 = i / 2;
    j2 = j / 2;

    if ( 
      ( ( i == 2 * i2 ) && ( j != 2 * j2 ) ) ||
      ( ( i != 2 * i2 ) && ( j == 2 * j2 ) ) )
    {
      k = k + l;
    }

    i = i2;
    j = j2;
    l = 2 * l;
  }

  return k;
}

Также есть i8_xor. И пара функций пресса.

Я думаю, что сообщение для DailyWTF в порядке.

РЕДАКТИРОВАТЬ: Для программистов, не являющихся c, вот краткое руководство к тому, что делает выше:

function xor i:unsigned, j:unsigned
  answer = 0
  bit_position = 1
  while i <> 0 or j <> 0
    if least significant bit of i <> least significant bit of j
      answer = answer + bit_position 
    end if
    bit_position = bit_position * 2
    i = i / 2
    j = j / 2
  end while
  return answer
end function

Чтобы определить, установлен или сброшен младший значащий бит, используется следующее:

bit set if i <> (i / 2) * 2
bit clear if i == (i / 2) * 2

Что делает код дополнительным WTFy, так это то, что C определяет оператор XOR, а именно '^'. Итак, вместо:

result = i4_xor (a, b);

Вы можете иметь:

result = a ^ b; // no function call at all!

Оригинальный программист должен знать об операторе xor. Но даже если они этого не сделали (и предоставили, это еще один запутанный символ C), их реализация функции XOR невероятно плоха.

2 голосов
/ 12 марта 2009

Я использую VC ++ 2003, и он мгновенно компилируется в обоих режимах отладки / выпуска.

Edit:

Установлен ли в вашей системе последний пакет обновления?

1 голос
/ 12 марта 2009

Я бы порекомендовал вам загрузить пробную версию Visual Studio 2008 и попробовать скомпилировать ее там, просто чтобы убедиться, что проблема присуща. Кроме того, если действительно произойдет в текущей версии, вы сможете сообщить о проблеме, и Microsoft может решить ее.

С другой стороны, нет шансов, что Microsoft исправит любую ошибку в VS2003.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...