Golang でのパフォーマンス テストの実践例
インターネット業界での Golang の普及に伴い、コード パフォーマンスの最適化に対する需要がますます顕著になってきています。パフォーマンス テストは、コードのパフォーマンスを評価する重要な手段となっています。この記事では、実際のケースを使用して、Golang でパフォーマンス テストを実行し、パフォーマンスのボトルネックを最適化する方法を紹介します。
ケースの背景
ファイル内のすべての単語の出現数をカウントするという要件があるとします。これは、次のコードを通じて実現できます。
func countWords(filename string) (map[string]int, error) { file, err := os.Open(filename) if err != nil { return nil, err } defer file.Close() scanner := bufio.NewScanner(file) scanner.Split(bufio.ScanWords) count := make(map[string]int) for scanner.Scan() { word := scanner.Text() count[word]++ } if err := scanner.Err(); err != nil { return nil, err } return count, nil }
パフォーマンス テスト
上記のコードでは、Golang の組み込み testing
パッケージを使用してパフォーマンス テストを実行できます。具体的なテスト関数は次のとおりです。
func BenchmarkCountWords(b *testing.B) { for i := 0; i < b.N; i++ { _, err := countWords("/path/to/file.txt") if err != nil { b.Errorf("unexpected error: %v", err) } } }
は、BenchmarkCountWords
関数を通じてパフォーマンス テストを実行します。b.N
はテストの数を表します。各テストでは、countWords
関数を呼び出し、エラーが発生するかどうかを判断します。エラーが発生した場合は、b.Errorf
を使用してエラーを報告します。
パフォーマンスのボトルネックの最適化
パフォーマンス テストの結果、ファイルが大きい場合、コードの実行時間が長くなることがわかりました。その理由は、ファイルを読み取るために行ごとのスキャンを使用し、単語の出現数をカウントするために文字列の連結を使用するためです。この実装では、大きなファイルを使用するとパフォーマンスが低下します。
このパフォーマンスのボトルネックに対処するには、同時メソッドを使用して最適化できます。具体的な実装は次のとおりです。
func countWords(filename string) (map[string]int, error) { file, err := os.Open(filename) if err != nil { return nil, err } defer file.Close() count := make(map[string]int) type result struct { word string count int } wordCh := make(chan result) done := make(chan struct{}) go func() { for r := range wordCh { count[r.word] += r.count } done <- struct{}{} }() scanner := bufio.NewScanner(file) scanner.Split(bufio.ScanWords) const numWorkers = 5 var workersWg sync.WaitGroup workersWg.Add(numWorkers) for i := 0; i < numWorkers; i++ { go func() { defer workersWg.Done() for scanner.Scan() { word := scanner.Text() wordCh <- result{word: word, count: 1} } }() } go func() { workersWg.Wait() close(wordCh) }() if err := scanner.Err(); err != nil { return nil, err } <-done return count, nil }
最適化されたコードでは、ファイルを読み取り、単語と出現数を wordCh ## に送信するための
numWorkers 同時ゴルーチンを作成しました。 # チャンネル内。同時に、チャネル内の単語と出現回数を受け取り、それらを
count マップに要約するための新しいゴルーチンを作成しました。この同時実行方式により、コードの実行効率が向上します。
以上がGolang でのパフォーマンステストの実践例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。