2016-03-07 3 views
0

Я работаю над симулятором, где каждая инструкция подсчитывается. Мы были привлечены к Go из-за абстракции интерфейса, но из бенчмаркинга в 5 раз хуже ссылаться на косвенную ориентацию интерфейса, а не на вызов метода напрямую. Однако наша структура проекта теперь использует использование интерфейсов для обхода круговых зависимостей. Есть ли способ сделать интерфейсы быстрее (сомнительно) или обойти круговые зависимости без интерфейсов?Как вы получаете максимальную производительность от Go при использовании интерфейсов?

ответ

5

Если вы видите круговые зависимости, это предполагает, что у вас есть код в отдельных модулях. Переместите весь код в один модуль. Тогда вам не нужен интерфейс. Модули, как правило, довольно большие группировки в Go. Не создавайте их только для организации кода.

+0

Хммм ... У нас это было изначально, но кажется, что он неорганизован, чтобы сохранить каждый файл в проекте в одной папке. В настоящее время мы уже находимся в 50+ файлах, не считая тестовых файлов. Также части нашего проекта логически независимы. Есть ли способ создания подпапок при сохранении одного пакета? – sirwillem

+2

Нет. Поместите их в одну папку. Модули не являются инструментом организации кода. Это инструмент повторного использования кода. Вполне нормально иметь много файлов в одном каталоге в Go. Вы также можете сделать ваши файлы слишком маленькими. Вам не нужен или не нужен один файл для каждого типа. То, что вы считаете подходящим для каталогов, может быть действительно подходящим для * файлов * в Go. Файлы - это инструмент организации естественного кода. –

+0

Хорошо, я думаю, что вокруг этого нет. Благодаря!! – sirwillem

2

Ну, плохая новость, интерфейсы примерно так же быстро, как они собираются на данный момент, могут немного улучшиться на 1,7, но не так много.

Если ваши интерфейсы не массивны, вы можете передавать funcs, а не интерфейсы.

Пример:

func Sort(a sort.Interface) // can be rewritten as 
func Sort(ln int, lessFn func(i, j) bool, swapFn func(i, j)) 

Но я 100% согласен с @RobNapier.

+0

Спасибо! Это отличная идея. Особенно, если вы делаете функции своего типа – sirwillem

+0

Было бы намного быстрее? Существует еще косвенное направление, и эти функции не могут быть встроены. – kostya

+0

@ kostya хорошо, зависит, на go 1.6 (текущая версия), это на ~ 25% быстрее, на текущем git, хотя это всего на ~ 2% быстрее. [Площадка] (http://play.golang.org/p/II_DHdYaLQ) – OneOfOne

Смежные вопросы