Я работаю над симулятором, где каждая инструкция подсчитывается. Мы были привлечены к Go из-за абстракции интерфейса, но из бенчмаркинга в 5 раз хуже ссылаться на косвенную ориентацию интерфейса, а не на вызов метода напрямую. Однако наша структура проекта теперь использует использование интерфейсов для обхода круговых зависимостей. Есть ли способ сделать интерфейсы быстрее (сомнительно) или обойти круговые зависимости без интерфейсов?Как вы получаете максимальную производительность от Go при использовании интерфейсов?
ответ
Если вы видите круговые зависимости, это предполагает, что у вас есть код в отдельных модулях. Переместите весь код в один модуль. Тогда вам не нужен интерфейс. Модули, как правило, довольно большие группировки в Go. Не создавайте их только для организации кода.
Ну, плохая новость, интерфейсы примерно так же быстро, как они собираются на данный момент, могут немного улучшиться на 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.
Спасибо! Это отличная идея. Особенно, если вы делаете функции своего типа – sirwillem
Было бы намного быстрее? Существует еще косвенное направление, и эти функции не могут быть встроены. – kostya
@ kostya хорошо, зависит, на go 1.6 (текущая версия), это на ~ 25% быстрее, на текущем git, хотя это всего на ~ 2% быстрее. [Площадка] (http://play.golang.org/p/II_DHdYaLQ) – OneOfOne
- 1. Как вы получаете ошибки от переполнения int-преобразований в Go?
- 2. Как вы переопределяете оператор == при использовании интерфейсов вместо реальных типов?
- 3. Как вы получаете payKey от транзакции?
- 4. Как вы получаете вывод системной команды в Go?
- 5. Как вы получаете числовое значение от UIDatepicker?
- 6. Как вы получаете другую версию от GAC
- 7. Как вы получаете детей от Tk Widget?
- 8. C# Как вы получаете base.Name от PropertyInfo
- 9. Как вы получаете значения от моделей?
- 10. Как вы получаете все записи от Сфинкса?
- 11. О интерфейсов Go
- 12. Получить максимальную производительность цикла
- 13. Плохая производительность при использовании HttpWebRequest от MonoTouch
- 14. Как получить максимальную производительность от facebook холста аутентификации
- 15. Что вы получаете от обновления NHibernate 1.2?
- 16. Настройка сетевых интерфейсов в Go
- 17. Как вы получаете значение «embed»?
- 18. Понимание интерфейсов в Go
- 19. Расширение интерфейсов в Go
- 20. Какие примеры интерфейсов Go?
- 21. Что делать, если вы получаете сообщение «SUCCESSWITHWARNING» от Paypal
- 22. Получаете ли вы такую же производительность, используя префиксы индекса?
- 23. Гипотетическая производительность при использовании SELECT *
- 24. Как определить отношения при использовании интерфейсов
- 25. Как вы получаете «это» функции?
- 26. Как вы получаете DatePicker из DatePickerDialog?
- 27. Как вы получаете IP-адрес от запроса в ASP.NET?
- 28. Использование пустых интерфейсов в go
- 29. Откуда вы получаете информацию о часовом поясе?
- 30. Как вы получаете SQLServerExpress для создания пользователей?
Хммм ... У нас это было изначально, но кажется, что он неорганизован, чтобы сохранить каждый файл в проекте в одной папке. В настоящее время мы уже находимся в 50+ файлах, не считая тестовых файлов. Также части нашего проекта логически независимы. Есть ли способ создания подпапок при сохранении одного пакета? – sirwillem
Нет. Поместите их в одну папку. Модули не являются инструментом организации кода. Это инструмент повторного использования кода. Вполне нормально иметь много файлов в одном каталоге в Go. Вы также можете сделать ваши файлы слишком маленькими. Вам не нужен или не нужен один файл для каждого типа. То, что вы считаете подходящим для каталогов, может быть действительно подходящим для * файлов * в Go. Файлы - это инструмент организации естественного кода. –
Хорошо, я думаю, что вокруг этого нет. Благодаря!! – sirwillem