1 回答

TA貢獻2051條經驗 獲得超10個贊
我看到了幾個問題,無論是從概念的角度還是技術的角度。
您使用一個通道來返回您的結果集(不錯,有點),但是您只是簡單地丟棄了結果。此外,您使用的是無緩沖通道,因此您在那里有一個瓶頸。請注意,這本身并不是問題,因為管道是構建程序的一種好方法——恕我直言,您只是在這里以錯誤的方式使用了它。符合的東西
package main
import (
"fmt"
"sync"
"time"
)
func main() {
le := 1000
// We want to wait until the operations finish
var wg sync.WaitGroup
// We "prealloc" err, since we do not want le * allocations
var err error
start := time.Now()
for i := 0; i < le; i++ {
// Add an operation to wait for to the group
wg.Add(1)
go func() {
// Ensure the WaitGroup is notified we are done (bar a panic)
defer wg.Done()
// Short notation, since we are not interested in the result set
if _,err = ioutil.ReadFile(fileName);err!=nil{
fmt.Println("read file error")
}
}()
}
// Wait until all operations are finished.
wg.Wait()
fmt.Printf("%d iterations took %s", le, time.Since(start))
}
將是我的解決方案。如果我有想法做這樣的事情。
但是如果我們深入研究代碼,基本上這里唯一可用的組件是ioutil.ReadFile. 將其用于值得進行基準測試的程序部分首先是一個非常糟糕的想法?。它應該用于相當小的文件(例如配置文件)——它本身并不是您要進行基準測試的程序的一部分。
您要做的基準測試是您剛剛讀取的文件的處理邏輯。讓我給你舉個例子:假設你想讀入一堆小的 JSON 文件,解組它們,修改它們,再次編組它們并將它們發送到 REST API。那么,在這種情況下,您想對程序的哪一部分進行基準測試?我敢打賭處理文件的邏輯。因為那是您可以實際優化的程序部分。您既不能優化ioutil.ReadFile也不能優化服務器。除非你碰巧也寫了這個。在這種情況下,您可能希望從服務器包中對服務器邏輯進行基準測試。
最后但同樣重要的是,您的問題標題為“Go 和 Java 之間的 IO 性能”。要實際測量 IO 性能,您需要非常大的 IO 操作。我傾向于為此使用 ISO 圖像 - 我傾向于使用真實世界的數據。
- 1 回答
- 0 關注
- 157 瀏覽
添加回答
舉報