L'optimisation des performances des fonctions Go implique les points suivants : éviter les fermetures capturant des variables externes et transmettre des variables en paramètres. Évitez les appels de méthode inutiles et accédez directement aux champs de structure. Utilisez goroutine pour exécuter des fonctions en parallèle, réduisant ainsi considérablement le temps d'exécution.
Dans Go, les fonctions sont des citoyens de premier ordre dans le langage, ce qui signifie qu'elles peuvent être transmises, affectées à des variables et même utilisées dans le cadre de types paramétrés. . Comprendre comment utiliser efficacement les fonctions est crucial pour tirer pleinement parti des performances de Go.
Une fermeture capture toutes les variables externes dans sa portée de définition. Lorsque la fermeture est appelée, ces variables sont copiées dans la fermeture, même si elles ne sont jamais utilisées dans la fermeture. Cela peut entraîner une dégradation des performances, en particulier lorsque la fermeture est appelée fréquemment ou contient de grandes quantités de données.
Exemple :
func genAdder(x int) func(int) int { return func(y int) int { return x + y } } adder1 := genAdder(1) adder2 := genAdder(2) // adder1 和 adder2 都会捕获变量 x fmt.Println(adder1(1)) // 输出:2 fmt.Println(adder2(1)) // 输出:3
Optimisation :
Pour éviter que les fermetures ne capturent des variables externes, vous pouvez transmettre ces variables en tant que paramètres à la fermeture.
func genAdder(x int) func(y int) int { return func(y int) int { return x + y } } adder1 := genAdder(1) adder2 := genAdder(2) // adder1 和 adder2 不再捕获变量 x fmt.Println(adder1(1)) // 输出:2 fmt.Println(adder2(1)) // 输出:3
Dans la programmation orientée objet, un grand nombre d'appels de méthode sont souvent générés. Cependant, chaque appel de méthode entraîne une surcharge d’exécution. Les performances peuvent être améliorées si les appels de méthode inutiles peuvent être évités.
Exemple :
type Person struct { name string } func (p *Person) GetName() string { return p.name } func main() { // 调用 GetName 方法来获取名称 person := Person{"Alice"} fmt.Println(person.GetName()) // 输出:Alice }
Optimisation :
Vous pouvez accéder directement aux champs de structure si vous avez juste besoin d'obtenir le nom sans effectuer d'autres opérations.
type Person struct { name string } func main() { // 直接访问结构体字段 person := Person{"Alice"} fmt.Println(person.name) // 输出:Alice }
Les fonctionnalités de concurrence de Go sont très puissantes et peuvent être utilisées pour améliorer les performances des applications avec des tâches informatiques volumineuses. Le temps d'exécution du programme peut être considérablement réduit en utilisant des goroutines (threads légers) pour exécuter des fonctions en parallèle.
Exemple :
// 计算一组数字的总和 func sum(numbers []int) int { sum := 0 for _, num := range numbers { sum += num } return sum } func main() { // 创建要计算其总和的数字列表 numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} // 串行计算总和 start := time.Now() serialSum := sum(numbers) fmt.Println("Serial sum:", serialSum) fmt.Println("Serial time:", time.Since(start)) // 并行计算总和 start = time.Now() var wg sync.WaitGroup wg.Add(len(numbers)) partialSums := make(chan int, len(numbers)) for _, num := range numbers { go func(num int) { defer wg.Done() partialSums <- sum([]int{num}) }(num) } go func() { wg.Wait() close(partialSums) }() concurrentSum := 0 for partialSum := range partialSums { concurrentSum += partialSum } fmt.Println("Concurrent sum:", concurrentSum) fmt.Println("Concurrent time:", time.Since(start)) }
Sortie :
Serial sum: 55 Serial time: 1.00424998ms Concurrent sum: 55 Concurrent time: 721.9786371ms
Dans cet exemple, le calcul parallèle améliore considérablement les performances du programme. En effet, les Goroutines peuvent s'exécuter simultanément tout en tirant parti des processeurs multicœurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!