Вы можете проверить это на ходу!
В вашем коде вы можете создать метод и эквивалентную функцию. Я делаю это в файле main.go
.
type A string
func (a A) Demo(i int) {}
func Demo(a A, i int) {}
Затем создайте ориентир для него в тестовом файле (main_test.go
для меня).
func BenchmarkMethod(b *testing.B) {
var a A = "test"
var i int = 123
for n := 0; n < b.N; n++ {
a.Demo(i)
}
}
func BenchmarkFunction(b *testing.B) {
var a A = "test"
var i int = 123
for n := 0; n < b.N; n++ {
Demo(a, i)
}
}
Затем проверьте контрольные показатели с go test -bench=.
BenchmarkMethod-8 2000000000 0.27 ns/op
BenchmarkFunction-8 2000000000 0.29 ns/op
PASS
Вы можете обновить свой метод и функции, чтобы сделать то же самое, чтобы увидеть, как это влияет на вещи.
func (a A) Demo(i int) string {
return fmt.Sprintf("%s-%d", a, i)
}
func Demo(a A, i int) string {
return fmt.Sprintf("%s-%d", a, i)
}
И тестирование этого по-прежнему дает мне почти идентичный перфоманс.
$ go test -bench=.
BenchmarkMethod-8 10000000 233 ns/op
BenchmarkFunction-8 10000000 232 ns/op
PASS
Так короткий ответ - я очень сомневаюсь, есть ли существенная разница в производительности между этими двумя, и если он выглядит как любой другой код запускается, вероятно, имеет большее влияние, чем при использовании методов против функций.
Go не является функциональным языком программирования * per se *. Golang поддерживает функции первого класса, см. Https://blog.golang.org/first-class-functions-in-go-and-new-go. Однако я не думаю, что это будет иметь какое-то значение в производительности - используйте первоклассные функции/рекурсию/и т. Д. когда имеет смысл использовать их. –
Методы Go - это просто функции, поэтому нет производительности, которая может быть вызвана одним или другим. – JimB
* «Мне сказали, что использование подхода, основанного на классе, для кодирования более функционально в Javascript, чем в функционале». * - игнорировать этот тип дриблинга. для всех возможных программ это не так. Используйте стиль, который вы хотите, и оптимизируйте его, когда это необходимо. – naomik