2017-02-14 13 views
0

Мне любопытно, если классный подход с использованием структур и функций в этих структурах более эффективен в Голанге?Go: Является ли классный подход более функциональным, чем функциональным?

До сих пор я не мог обнаружить любые ресурсы, которые сравнивают два разных метода.

Этот вопрос возник из беседы, когда мне сказали, что использование подхода, основанного на классе, для кодирования является более совершенным в Javascript, чем функциональным.

+0

Go не является функциональным языком программирования * per se *. Golang поддерживает функции первого класса, см. Https://blog.golang.org/first-class-functions-in-go-and-new-go. Однако я не думаю, что это будет иметь какое-то значение в производительности - используйте первоклассные функции/рекурсию/и т. Д. когда имеет смысл использовать их. –

+0

Методы Go - это просто функции, поэтому нет производительности, которая может быть вызвана одним или другим. – JimB

+0

* «Мне сказали, что использование подхода, основанного на классе, для кодирования более функционально в Javascript, чем в функционале». * - игнорировать этот тип дриблинга. для всех возможных программ это не так. Используйте стиль, который вы хотите, и оптимизируйте его, когда это необходимо. – naomik

ответ

1

Вы можете проверить это на ходу!

В вашем коде вы можете создать метод и эквивалентную функцию. Я делаю это в файле 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 

Так короткий ответ - я очень сомневаюсь, есть ли существенная разница в производительности между этими двумя, и если он выглядит как любой другой код запускается, вероятно, имеет большее влияние, чем при использовании методов против функций.

+1

на .27ns на op, ваш первый тест, вероятно, полностью оптимизирован (или, может быть, это будет точка здесь, что это не имеет значения) – JimB

+0

Это в основном точка - если мы не можем сказать какой-либо заметной разницы в наших тестах, скорее всего, это не стоит беспокоиться. – joncalhoun

+0

Очень полный и лаконичный, именно то, что я искал. – Britt

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

  • Нет связанных вопросов^_^