Сравнительный анализ в Golang:
Бенчмаркинг обычно связан с оценкой характеристик производительности аппаратного обеспечения компьютера, например производительности процессора при операциях с плавающей запятой, но бывают обстоятельства, когда этот метод применим и к программному обеспечению.
В пакете go testing есть средство тестирования производительности, которое можно использовать для оценки производительности вашего кода Go. Тесты размещаются внутри _test.go
файлов и следуют правилам своих аналогов.
Давайте рассмотрим пример, чтобы понять, как тесты могут быть написаны на Golang. Рассмотрим программу, которая вычисляет факториал заданного числа.
func Fact(n int) int{ if n > 0{ return n * Fact(n-1) }else { return 1 } }
_test.go
содержат контрольные показатели и ограничения для тестовых аналогов. В приведенной выше программе мы будем измерять скорость вычислений факториала числа 10.
Напишем эталонную функцию.
package main import "testing" func BenchmarkFact(b *testing.B) { // run the Fib function b.N times for n := 0; n < b.N; n++ { Fact(10) } }
Написание бенчмарка совместно используемой инфраструктуры из пакета testing
. Функция тестирования начинается с Benchmark
и запускается несколько раз путем «тестирования» пакета на основе значения b.N
. Значение увеличивается каждый раз, когда бегун удовлетворен стабильностью теста.
Теперь запустите тестовую функцию, используя
go test -bench=.
Команда test говорит, что мы передаем параметр -bench, чтобы пройти тест, передав регулярное выражение, которое соответствует всем. Регулярное выражение должно быть допустимым, иначе передача только -bench вызовет синтаксическую ошибку.
Из результатов первая строка дает среднее время выполнения тестируемой функции для конечного значения b.N
итераций. Для приведенной выше контрольной функции он выполняет Fact(10) за 39,6 наносекунд в моей локальной системе. Вторая строка, PASS, исходит из тестовой части драйвера test
. В третьей строке содержится информация о пути к файлу и времени, затраченном на выполнение.
Если мы хотим сравнить несколько входных данных, мы будем следовать приведенной ниже структуре программы.
package main import "testing" func benchmarkFact(i int, b *testing.B) { // run the Fib function b.N times for n := 0; n < b.N; n++ { Fact(10) } } func BenchmarkFact1(b *testing.B) { benchmarkFact(1, b) } func BenchmarkFact5(b *testing.B) { benchmarkFact(5, b) } func BenchmarkFact10(b *testing.B) { benchmarkFact(10, b) } func BenchmarkFact15(b *testing.B) { benchmarkFact(15, b) } func BenchmarkFact20(b *testing.B) { benchmarkFact(20, b) }
Вывод:
Сравнительный анализ в Go работает довольно хорошо и широко признан надежным стандартом вычислительной эффективности кода Go. Составление бенчмарков само по себе — отличный способ сообщить об улучшении производительности.
Безопасность:
Безопасность языка программирования можно определить по его способности обнаруживать любые ошибки в программе и противодействовать им как можно раньше.
Есть несколько факторов, которые необходимо учитывать, чтобы решить, является ли язык безопасным или небезопасным, но их можно свести к двум факторам:
- Безопасность типов: способность языка предотвращать различные ошибки, связанные с типами.
- Безопасность памяти.Способность языка предотвращать различные ошибки, связанные с памятью, такие как выход за пределы памяти, свободное после использования и т. д.
Go — язык со строгими и статическими типами. Поэтому можно с уверенностью сказать, что тип никогда не будет неправильно истолкован. В Go нет арифметики указателей, хотя в нем есть «nil», который является своего рода нулевой ссылкой.
В этом смысле утверждения типа в Go работают на пользу языку, например, эквивалент «void*» в Go-«Interface{}» приводится более безопасным способом с использованием type- утверждений, так что это не просто приведет к сбою и позволит более безопасно тестировать типы или переключать типы. Итак, мы можем сказать, что Go является типобезопасным.
Объем памяти:
Объем памяти — это не что иное, как объем основной памяти, которую программа использует или на которую ссылается во время ее работы. Это относится к физической памяти, которую занимает объект. Объем памяти — важный аспект, который следует учитывать при программировании на Golang, поскольку он отражает управление памятью.
Вот пример программы, для которой вычисляется выделение памяти, чтобы определить объем памяти программы.
package main import ( "runtime" "fmt" "time" ) func main() { PrintMemUsage() var overall [][]int for i := 0; i<4; i++ { a := make([]int, 0, 999999) overall = append(overall, a) PrintMemUsage() time.Sleep(time.Second) } overall = nil PrintMemUsage() runtime.GC() PrintMemUsage() } func PrintMemUsage() { var m runtime.MemStats runtime.ReadMemStats(&m) fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc)) fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc)) fmt.Printf("\tSys = %v MiB", bToMb(m.Sys)) fmt.Printf("\tNumGC = %v\n", m.NumGC) } func bToMb(b uint64) uint64 { return b / 1024 / 1024 }
Это память, выделенная для переменной «всего» за 4 итерации цикла for.
Следовательно, знание памяти, занимаемой программой, помогает разработчику определить, сколько и какого размера общие библиотеки или классы она загружает.
Простота использования:
Если вы знакомы с каким-либо языком программирования, Golang легко освоить благодаря простому синтаксису. Гораздо быстрее получить практический опыт работы с Golang с помощью Tour of Go и разработать свою первую программу за пару дней. Go — это, в частности, язык программирования системного уровня для высокомасштабируемых сетевых серверов и распределенной системной архитектуры. Go в основном решает проблемы с медленным выполнением и компиляцией программ, проблемы с версиями и зависимости, которыми трудно управлять.
Go дает программистам удобство сопровождения и простоту кода. Например, вы можете написать функцию несколькими способами, но в Go есть только один способ записи. Таким образом, вам не нужно беспокоиться о понимании семантики кода, написанного ранее разработчиком, это будет в значительной степени прямым определением функции в Go. По сравнению с другими языками, такими как C, C++ go имеет преимущество безопасности типов и безопасности памяти, а чтение кода Go сравнительно намного проще, чем другие. Go автономен и эффективен, поскольку программы Go, скомпилированные с помощью gc
, работают быстрее, чем другие языки программирования, поддерживаемые GNU.
Следуя за Effective Go и возясь со стандартной библиотекой, набором веб-инструментов, таким как Gorilla и Go, вы станете достойным разработчиком Golang.
Причина использования Golang:
Как обсуждалось выше, Golang прост в использовании, а документация с практическими руководствами, представленными на официальном веб-сайте, делает Go удобным языком для начинающих программистов.
Основные причины использования Golang следующие:
- Golang обеспечивает простое параллельное программирование с горутинами и каналами.
- Веб-сайт Go предоставляет отличные ресурсы для начала.
- Go имеет опытную стандартную библиотеку, которая поддерживает аспекты, связанные с сетевыми протоколами, такими как HTTP-клиент и сервер, шифрование, сжатие, отправка электронной почты и т. д.
- Go эффективен. Это потрясающий опыт для пользователей, перешедших с Python, Ruby или Node.js, поскольку go значительно увеличивает количество одновременных запросов, которые может обработать сервер.
- Дать определение формата кода — огромная проблема. Go решает эту проблему, определяя канонический формат для кода, написанного на Go. Инструмент
gofmt
переформатирует ваш код. - Go предоставляет стандартизированную среду тестирования для выполнения параллельного тестирования и сравнительного анализа, а также имеет несколько наборов инструментов для выполнения тестирования между сетевыми клиентами и серверами.
Авторы:
Ибрагим Мохаммад @github @linkedin
Нитеш Ярра @github @linkedin
Шри Сурадж Булусу@github @linkedin