Профилировщик не должен существенно влиять на ваши результаты синхронизации. Если накладные расходы профилировщика действительно"значительны", то вы, вероятно, не сможете выжать гораздо большую скорость из своего кода, и вам следует подумать о поиске узких мест вашего оборудования (диска, ОЗУ или ЦП?) И модернизация. (Звучит так, как будто вы привязаны к процессору, вот с чего начать)
В целом .net и JIT освобождают вас от большинства проблем переноса 64-битных систем. Как вы знаете, существуют эффекты, относящиеся к размеру регистра (изменения использования памяти, маршалинг для собственного кода, необходимость для всех частей программы иметь собственные 64-битные сборки) и некоторые различия в производительности (большая карта памяти, больше регистров, более широкие шины и т.д.), поэтому я не могу сказать вам больше, чем вы уже знаете об этом. Другие проблемы, с которыми я сталкивался, связаны с ОС, а не с C # - теперь существуют разные кусты реестра для 64-битных приложений и приложений WOW64, например, поэтому некоторые обращения к реестру должны быть написаны аккуратно.
Обычно плохая идея беспокоиться о том, что JIT будет делать с вашим кодом, и пытаться настроить его так, чтобы он работал лучше, потому что JIT, вероятно, изменится с .net 4, 5 или 6, и ваши «оптимизации» могут обернуться в неэффективность или, что еще хуже, ошибки. Также имейте в виду, что JIT компилирует код специально для процессора, на котором он работает, поэтому потенциально улучшение вашего ПК для разработки может не быть улучшением на другом ПК. То, что вам не нравится с использованием сегодняшнего JIT на сегодняшнем процессоре, может укусить вас через годы, когда вы что-то обновите.
В частности, вы цитируете «свойства не встроены в x64». К тому времени, как вы пройдете всю свою кодовую базу, превратив все свои свойства в поля, вполне может появиться новый JIT для 64-битных, который имеет встроенные свойства. Действительно, он может работать лучше, чем ваш «обходной» код. Позвольте Microsoft оптимизировать это для вас.
Вы справедливо указываете, что ваш профиль памяти может измениться. Таким образом, вам может понадобиться больше оперативной памяти, более быстрые диски для виртуальной памяти и больший кэш-память процессора. Все проблемы с оборудованием. Вы можете уменьшить эффект, используя (например) Int32, а не int, но это может не иметь большого значения и может потенциально снизить производительность (поскольку ваш ЦП может обрабатывать собственные 64-разрядные значения более эффективно, чем 32-разрядные значения половинного размера). ).
Вы говорите, что «время запуска может быть больше», но это кажется довольно неуместным в приложении, которое, по вашему мнению, работает в течение часов при 100% ЦП.
Так о чем вы действительно беспокоитесь? Может быть, время вашего кода на 32-разрядном компьютере, а затем время выполнения той же задачи на 64-разрядном компьютере. Есть ли разница в получасе за 4 часа? Или разница всего 3 секунды? Или 64-битный ПК на самом деле быстрее? Может быть, вы ищете решения проблем, которые не существуют.
Итак, вернемся к обычному, более общему совету. Профиль и время для выявления узких мест. Посмотрите на алгоритмы и математические процессы, которые вы применяете, и попробуйте улучшить / заменить их более эффективными. Убедитесь, что ваш многопоточный подход помогает, а не наносит ущерб вашей производительности (то есть избегаются блокировки и ожидания). Попробуйте уменьшить выделение / освобождение памяти - например, повторно использовать объекты, а не заменять их новыми. Попробуйте сократить использование частых вызовов функций и виртуальных функций. Переключитесь на C ++ и избавьтесь от накладных расходов на сборку мусора, проверку границ и т. Д., Которые навязывает .net. Хммм. Ничто из этого не имеет ничего общего с 64-битным, не так ли?