speed_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package diskv
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "testing"
  6. )
  7. func shuffle(keys []string) {
  8. ints := rand.Perm(len(keys))
  9. for i := range keys {
  10. keys[i], keys[ints[i]] = keys[ints[i]], keys[i]
  11. }
  12. }
  13. func genValue(size int) []byte {
  14. v := make([]byte, size)
  15. for i := 0; i < size; i++ {
  16. v[i] = uint8((rand.Int() % 26) + 97) // a-z
  17. }
  18. return v
  19. }
  20. const (
  21. keyCount = 1000
  22. )
  23. func genKeys() []string {
  24. keys := make([]string, keyCount)
  25. for i := 0; i < keyCount; i++ {
  26. keys[i] = fmt.Sprintf("%d", i)
  27. }
  28. return keys
  29. }
  30. func (d *Diskv) load(keys []string, val []byte) {
  31. for _, key := range keys {
  32. d.Write(key, val)
  33. }
  34. }
  35. func benchRead(b *testing.B, size, cachesz int) {
  36. b.StopTimer()
  37. d := New(Options{
  38. BasePath: "speed-test",
  39. Transform: func(string) []string { return []string{} },
  40. CacheSizeMax: uint64(cachesz),
  41. })
  42. defer d.EraseAll()
  43. keys := genKeys()
  44. value := genValue(size)
  45. d.load(keys, value)
  46. shuffle(keys)
  47. b.SetBytes(int64(size))
  48. b.StartTimer()
  49. for i := 0; i < b.N; i++ {
  50. _, _ = d.Read(keys[i%len(keys)])
  51. }
  52. b.StopTimer()
  53. }
  54. func benchWrite(b *testing.B, size int, withIndex bool) {
  55. b.StopTimer()
  56. options := Options{
  57. BasePath: "speed-test",
  58. Transform: func(string) []string { return []string{} },
  59. CacheSizeMax: 0,
  60. }
  61. if withIndex {
  62. options.Index = &BTreeIndex{}
  63. options.IndexLess = strLess
  64. }
  65. d := New(options)
  66. defer d.EraseAll()
  67. keys := genKeys()
  68. value := genValue(size)
  69. shuffle(keys)
  70. b.SetBytes(int64(size))
  71. b.StartTimer()
  72. for i := 0; i < b.N; i++ {
  73. d.Write(keys[i%len(keys)], value)
  74. }
  75. b.StopTimer()
  76. }
  77. func BenchmarkWrite__32B_NoIndex(b *testing.B) {
  78. benchWrite(b, 32, false)
  79. }
  80. func BenchmarkWrite__1KB_NoIndex(b *testing.B) {
  81. benchWrite(b, 1024, false)
  82. }
  83. func BenchmarkWrite__4KB_NoIndex(b *testing.B) {
  84. benchWrite(b, 4096, false)
  85. }
  86. func BenchmarkWrite_10KB_NoIndex(b *testing.B) {
  87. benchWrite(b, 10240, false)
  88. }
  89. func BenchmarkWrite__32B_WithIndex(b *testing.B) {
  90. benchWrite(b, 32, true)
  91. }
  92. func BenchmarkWrite__1KB_WithIndex(b *testing.B) {
  93. benchWrite(b, 1024, true)
  94. }
  95. func BenchmarkWrite__4KB_WithIndex(b *testing.B) {
  96. benchWrite(b, 4096, true)
  97. }
  98. func BenchmarkWrite_10KB_WithIndex(b *testing.B) {
  99. benchWrite(b, 10240, true)
  100. }
  101. func BenchmarkRead__32B_NoCache(b *testing.B) {
  102. benchRead(b, 32, 0)
  103. }
  104. func BenchmarkRead__1KB_NoCache(b *testing.B) {
  105. benchRead(b, 1024, 0)
  106. }
  107. func BenchmarkRead__4KB_NoCache(b *testing.B) {
  108. benchRead(b, 4096, 0)
  109. }
  110. func BenchmarkRead_10KB_NoCache(b *testing.B) {
  111. benchRead(b, 10240, 0)
  112. }
  113. func BenchmarkRead__32B_WithCache(b *testing.B) {
  114. benchRead(b, 32, keyCount*32*2)
  115. }
  116. func BenchmarkRead__1KB_WithCache(b *testing.B) {
  117. benchRead(b, 1024, keyCount*1024*2)
  118. }
  119. func BenchmarkRead__4KB_WithCache(b *testing.B) {
  120. benchRead(b, 4096, keyCount*4096*2)
  121. }
  122. func BenchmarkRead_10KB_WithCache(b *testing.B) {
  123. benchRead(b, 10240, keyCount*4096*2)
  124. }