Почему время, затрачиваемое моей программой в MS Visual Studio 2013 в режиме RELEASE в 64-разрядном режиме, составляет треть времени, затрачиваемого в 32-разрядном режиме

Я использую кодировщик HM-16.15 в режиме RELEASE в Visual Studio 2013. Кодировщик HM-16.15 — это очень большая программа на C ++ (200 тыс. Строк кода). У меня есть два времени (T1 и T2). Общее время, затраченное программой T = T1 + T2.

когда я собираю и отлаживаю программу в 64-битном режиме и 32-битном режиме отдельно. Время в 64-битном режиме по сравнению с 32-битным выглядит следующим образом

  • T1 (64 бита) = T1 (32 бита) х 0,34 почти
  • T2 (64 бита) = T2 (32 бита) x 0,78 почти

Насколько мне известно, T1 (64 бита) должен быть больше или равен T1 (32 бита) х 0,5. Но как это происходит для T1?

1

Решение

x86_64 (64-разрядная) платформа намного более чем в два раза больше ширины x86 (32-бит).

Помимо более широких регистров (64-битных вместо 32-битных), x86_64 имеет:

  • Еще 8 регистров общего назначения (r8, r9, r10, r11, r12, r13, r14, r15)
  • Еще 8 потоковых (SSE) регистров
  • Векторные расширения (AVX)
  • Дополнительные инструкции, например указатель инструкций относительно доступа к данным
  • X86_64 соглашение о вызовах использует больше регистров для передачи аргументов и работает быстрее, чем 32-битный cdecl или даже fastcall (Windows ABI)
  • Некоторая арифметика на процессоре x86_64 может быть быстрее в 64-битном режиме, чем в 32-битном режиме (например, IMUL r64 равен 3c, а IMUL r32 равен 4c)

Таким образом, нет ничего необычного в том, чтобы увидеть T1 (64 бит) < T1 (32 бита) х 0,5, но он также может легко пойти другим путем. В общем, трудно предсказать, каким образом будет развиваться это отношение, без фактического тестирования и профилирования вашего кода.

2

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

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

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