Прога - ничего особенного, обычный сетевой сервер, сделанный в виде windows service. Принимает всякое, обрабатывает в несколько потоков, отдает дальше. Из системных библиотек кроме обычного набора используются только winsock & rpcrt4. asm вставок нет, потому перенос на 64бита был относительно простым. Собрано на visual studio 2008 со статически слинкованным runtime.
В табличке приведен VirtSize per section и соотношение между размерами 64 и 32битных версий
Имя секциии | win32 | win64 | Ratio |
---|---|---|---|
.text | 1015505 | 1312586 | 1.29 |
.rdata | 570426 | 720718 | 1.26 |
.data | 311932 | 355440 | 1.14 |
.reloc | 79806 | 27102 | 0.34 |
Например в 64битной версии релоки (прога слинкована с поддержкой aslr) значительно меньше - подозреваю, что все они для релоцирования данных, ибо адресация относительно RIP минимизирует их использование в коде.
Кроме того под 64бита все обработчики исключений лежат в отдельной секции .pdata - еще + 59124 байт. Забавно что из содержимого .pdata можно точно установить адреса и размеры по крайней мере ф-ций, содержащих exception processing
Общий итог - прога под 64бита весит на 25% больше 32битного аналога. Подозреваю что для любых более-менее больших программ это соотношение должно быть примерно таким всегда.
Интересно также что при работе 64битная версия стабильно использует памяти на 35-40% больше при одинаковых нагрузках и числе клиентов
Комментариев нет:
Отправить комментарий