Я вижу несколько проблем с этим, как с концептуальной точки зрения, так и с технической.
Вы используете канал для возврата набора результатов (хорошо, вроде), но затем вы простовыбросить результат.Кроме того, вы используете небуферизованный канал, поэтому у вас есть задушевная точка.Обратите внимание, что это не проблема, так как конвейеры являются отличным способом структурирования вашей программы - вы просто неправильно использовали ее здесь, imho.Что-то в строке
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
.Использование этого для программных частей, которые заслуживают сравнительного анализа, - это в первую очередь Very Bad Idea ™.Его следует использовать для довольно небольших файлов (например, файлов конфигурации), что само по себе не является частью вашей программы, которую вы хотите тестировать.
То, что вы делаете хотитебенчмарк - это логика обработки файлов, которые вы только что прочитали.Позвольте мне привести пример: скажем, вы хотите прочитать несколько небольших файлов JSON, разобрать их, изменить, снова маршалировать и отправить в REST API.Итак, какую часть вашей программы вы бы хотели сравнить в этом случае?Моя ставка идет на логику обработки файлов.Потому что это часть программы, которую вы можете на самом деле оптимизировать.Вы не можете ни оптимизировать ioutil.ReadFile
, ни сервер.Если вам не случится написать это тоже.В этом случае вы захотите сравнить логику сервера из пакета сервера.
И, наконец, ваш вопрос называется «Производительность ввода-вывода между Go и Java».Чтобы реально измерить производительность ввода-вывода, вам понадобятся очень большие операции ввода-вывода.Я склонен использовать ISO-образы для этого - данные реального мира, которые я обычно собираю.