2010-06-17 2 views
0

Предположим, что память не является проблемой, а таргетинг на 64-разрядную ОС заставит консольное приложение Windows C/C++ работать быстрее?Зависит ли скорость от C/C++, консольного приложения Windows от 32 или 64 бит?

Обновление: Подтверждаемое несколькими комментариями/ответами приложение включает статистические алгоритмы (например, линейную алгебру, розыгрыши случайных чисел и т. Д.).

+11

Ответ неизбежно «возможно.« –

+1

Я бы любил кого-то, чтобы на самом деле положил только ответ« Может быть ». Увы, это слишком коротко. – Joey

+0

Это было задано до: http://stackoverflow.com/questions/1479953/porting-32-bit- c-code-to-64-bit-is-it-worth-it-why – caf

ответ

3

Ответы главным образом на редактирование, а не на исходный вопрос: я портировал одно приложение, которое сильно влияет на статистику и (особенно) линейную алгебру для работы в виде 64-битного кода. Для этого кода усилия были минимальными, и мы получили около 3: 1 улучшение скорости.

Я подозреваю, что большинство понятий о том, что там часто не будет (как правило, косвенно) от компаний, у которых есть код, который будет непросто переносить, и прилагают все усилия, чтобы рассказать клиентам, почему это хорошо идея продолжить покупку своей программы, хотя это еще 32-битный код. Из кода, который я портировал (или просто «перекомпилировал» в большинстве случаев) none вышел медленнее, как 64-разрядный код, и большинство из них вышло хотя бы немного быстрее.

+0

Спасибо. Полезно знать, прежде чем я начну с каких-либо усилий по переносу кода. – vad

3

Ответ может быть. Вы должны измерить.

Использование 64-битной цели позволяет использовать больше регистров, что подразумевает меньший доступ к памяти и, тем самым, более быстрое выполнение.

С другой стороны, использование 64-битной цели заставляет все указатели и адреса быть 64 битами, увеличивая объем памяти и замедляя выполнение.

+0

64-разрядная ОС предоставляет доступ к большему количеству регистров процессора? –

+3

@Martin: Я думаю, что для x86-64 у вас вдвое больше GPR по сравнению с ванилью x86.Не может иметь значение, если компилятор умный. – Joey

+1

@Johannes там тоже, на x86_64 меньшее количество из них зарезервировано для других целей, поэтому на самом деле оно немного больше, чем в два раза, плюс плавающая запятая с инструкциями sse а не x87, которые могут быть хорошими (если вы не используете много вещей, таких как sin/cos/sqrt/etc, на x87 аппаратное обеспечение может их выполнять, но с sse оно не происходит и перемещение значений от одного к другому дорогой) @ Мартин, это не ОС, которая делает это, это то, что вы r unning в 64-битном режиме, так что теперь вы можете просто увидеть новые регистры. – Spudd86

1

Ответ большой Возможно.

Ориентация на другую платформу, безусловно, будет иметь влияние на производительность приложения, поскольку вы вносите существенные изменения в приложение. Он имеет разную семантику размеров для типов, операций и очень разных операционных систем для взаимодействия.

Эти факторы и многие другие, безусловно, приведут к изменению производительности вашего приложения. Является ли это тонким, огромным, лучше, хуже и т. Д., Будет очень специфичным для типа приложения, которое вы пишете. Здесь невозможно дать общий ответ без каких-либо подробностей.

+0

, не говоря уже о плохо выложенных структурах данных, может (из-за ограничений выравнивания) раздуваться довольно плохо (например, 'struct foo {int * p1; int i; int * p2 ; int j;}; 'удваивается по размеру, несмотря на то, что int все еще только 32 бит в ширину, изменяя его как' struct foo {int * p1, * p2; int i, j;}; насколько это возможно) – Spudd86

0

При прочих равных условиях (что маловероятно) дополнительный размер данных в 64 бит (в два раза больше данных для перемещения по указателям) приведет к тому, что он будет медленнее.

Но другие факторы (например, WOW накладных расходов) может доминировать над вещами ...

Единственный способ будет протестировать приложение на аппаратных средствах ориентации.

+2

Вы пропустили тот факт, что x86_64 имеет больше регистров, а плавающая запятая по умолчанию - sse, а не x87. – Spudd86

+0

. Подслушав WoW64, минимально. Код общего назначения будет работать быстрее в WoW, чем в собственном x86-64, но любой математический и стандартный SSE даст вам очень хорошее улучшение скорости. – CMircea

-1

Возможно медленнее - вы только эффективно вдвое размер кэш-памяти процессора

инженеров Конечно Intel и AMD, знают это, поэтому менеджер памяти имеет много работы, чтобы уменьшить влияние 64-битных широких указателей и целых, используются только низкие 32 бита

+0

«уменьшил размер кэша процессора» - только для указателей тяжелых вещей int/float/double имеют одинаковый размер на x86_64 (int все еще только 32 бит), и все, что работает только на старых регистрах, все равно может использовать одинаковые коды операций, поэтому ваш код не будет слишком высок – Spudd86

+0

, если на вашей архитектуре «int» теперь 64-битная (как это было на Alpha), или все коды операций теперь имеют ширину 64 бит. –

+0

@ spudd86, в x86_64 ints - 64-разрядные, возможно, вы смешиваете его с типом данных int в c/C++ или другом языке, где размер определяется компилятором, а не процессором. – mikerobi

0

Если большая часть времени выполнения тратится на математику, тогда вы можете получить выгоду. В большинстве случаев это неверно. Если вы делаете монтированные карло-симуляции ядерных реакторов или рендер-лучников или что-то подобное, вы, вероятно, увидите большую пользу. Мой SWAG «не очень полезен»