Я уверен, что этот ответ выдержит много тепла, но здесь идет:
Вы не уменьшите время выполнения, переключившись на Go, особенно если ваш код уже не содержит мьютексов. Go не гарантирует эффективную балансировку программ и в настоящее время не будет наилучшим образом использовать имеющиеся ядра. Сгенерированный код медленнее, чем C ++. Сильные стороны Го в чистых абстракциях и параллелизме, не параллелизм.
Чтение всего файла заранее не особенно эффективно, если вам нужно вернуться и вернуться назад по памяти. Части файла, которые вы больше не будете использовать до тех пор, пока гораздо позже, не будут удалены из кеша, а затем снова будут загружены. Вы должны рассмотреть отображение памяти, если ваша платформа позволит это сделать, чтобы страницы загружались с диска по мере необходимости.
Если есть какая-либо интенсивная межпрограммная связь или зависимости между данными, вы должны попытаться сделать алгоритм однопоточным. Трудно сказать, не зная больше о подпрограммах, которые вы применяете к данным, но вполне возможно, что вы преждевременно извлекли потоки в надежде на волшебное повышение производительности.
Если вы не можете полагаться на отображение памяти из-за размера файла или других ограничений платформы, вам следует рассмотреть возможность использования вызова pread, тем самым повторно используя один дескриптор файла и читая только по мере необходимости.
Как всегда, следующее правило относится к оптимизации. Вы должны профиль. Вы должны проверить, что изменения, которые вы вносите в рабочее решение, улучшают ситуацию. Очень часто вы обнаружите, что отображение памяти, многопоточность и другие махинации никак не влияют на производительность. Это также тяжелая битва, если вы переходите с C или C ++.
Кроме того, вы должны порождать процедуры для обработки каждой части файла и сокращения результатов вычислений через канал. Убедитесь, что для GOMAXPROCS
установлено соответствующее значение.