Skip to content

Instantly share code, notes, and snippets.

@msteffen
Last active July 16, 2017 06:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save msteffen/08267045be42eb40900758c419c3bd38 to your computer and use it in GitHub Desktop.
Save msteffen/08267045be42eb40900758c419c3bd38 to your computer and use it in GitHub Desktop.
Filesystem benchmark in Go
package main
import (
"fmt"
"os"
"testing"
)
func BenchmarkWrite(b *testing.B) {
for cnt, cntP := 10, 1; cntP <= 3; cnt, cntP = cnt*10, cntP+1 {
for bts, btsP := 10, 1; btsP <= 3; bts, btsP = bts*10, btsP+1 {
content := make([]byte, bts)
for i := 0; i < bts; i++ {
content[i] = byte('a' + (i % 26))
}
os.Remove("testfile.txt")
b.Run(fmt.Sprintf("Write_%d_Bytes_%d_times", bts, cnt), func(b *testing.B) {
// Create test file
f, err := os.OpenFile("testfile.txt", os.O_CREATE, 0644)
if err != nil {
b.Error(err)
}
if err := f.Close(); err != nil {
b.Error(err)
}
// Perform repeated writes to file
b.ResetTimer()
for i := 0; i < cnt*b.N; i++ {
f, err := os.OpenFile("testfile.txt", os.O_WRONLY, 0644)
if err != nil {
b.Error(err)
}
if _, err := f.Write(content); err != nil {
b.Error(err)
}
if err := f.Sync(); err != nil {
b.Error(err)
}
if err := f.Close(); err != nil {
b.Error(err)
}
}
})
}
}
}
func BenchmarkAppend(b *testing.B) {
for cnt, cntP := 10, 1; cntP <= 3; cnt, cntP = cnt*10, cntP+1 {
for bts, btsP := 10, 1; btsP <= 3; bts, btsP = bts*10, btsP+1 {
content := make([]byte, bts)
for i := 0; i < bts; i++ {
content[i] = byte('a' + (i % 26))
}
os.Remove("testfile.txt")
b.Run(fmt.Sprintf("Append_%d_Bytes_%d_times", bts, cnt), func(b *testing.B) {
// Create file and immediately close it
f, err := os.OpenFile("testfile.txt", os.O_CREATE, 0644)
if err != nil {
b.Error(err)
}
if err := f.Close(); err != nil {
b.Error(err)
}
// Append bytes to file
b.ResetTimer()
for i := 0; i < cnt*b.N; i++ {
f, err := os.OpenFile("testfile.txt", os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
b.Error(err)
}
if _, err := f.Write(content); err != nil {
b.Error(err)
}
if err := f.Sync(); err != nil {
b.Error(err)
}
if err := f.Close(); err != nil {
b.Error(err)
}
}
})
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment