fastint_test.tmpl 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. // +build amd64
  2. // Code generated by Makefile, DO NOT EDIT.
  3. /*
  4. * Copyright 2021 ByteDance Inc.
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. package {{PACKAGE}}
  19. import (
  20. `strconv`
  21. `testing`
  22. `fmt`
  23. `github.com/stretchr/testify/assert`
  24. )
  25. func TestFastInt_IntToString(t *testing.T) {
  26. var buf [32]byte
  27. assert.Equal(t, "0" , string(buf[:i64toa(&buf[0], 0)]))
  28. assert.Equal(t, "1" , string(buf[:i64toa(&buf[0], 1)]))
  29. assert.Equal(t, "12" , string(buf[:i64toa(&buf[0], 12)]))
  30. assert.Equal(t, "123" , string(buf[:i64toa(&buf[0], 123)]))
  31. assert.Equal(t, "1234" , string(buf[:i64toa(&buf[0], 1234)]))
  32. assert.Equal(t, "12345" , string(buf[:i64toa(&buf[0], 12345)]))
  33. assert.Equal(t, "123456" , string(buf[:i64toa(&buf[0], 123456)]))
  34. assert.Equal(t, "1234567" , string(buf[:i64toa(&buf[0], 1234567)]))
  35. assert.Equal(t, "12345678" , string(buf[:i64toa(&buf[0], 12345678)]))
  36. assert.Equal(t, "123456789" , string(buf[:i64toa(&buf[0], 123456789)]))
  37. assert.Equal(t, "1234567890" , string(buf[:i64toa(&buf[0], 1234567890)]))
  38. assert.Equal(t, "12345678901" , string(buf[:i64toa(&buf[0], 12345678901)]))
  39. assert.Equal(t, "123456789012" , string(buf[:i64toa(&buf[0], 123456789012)]))
  40. assert.Equal(t, "1234567890123" , string(buf[:i64toa(&buf[0], 1234567890123)]))
  41. assert.Equal(t, "12345678901234" , string(buf[:i64toa(&buf[0], 12345678901234)]))
  42. assert.Equal(t, "123456789012345" , string(buf[:i64toa(&buf[0], 123456789012345)]))
  43. assert.Equal(t, "1234567890123456" , string(buf[:i64toa(&buf[0], 1234567890123456)]))
  44. assert.Equal(t, "12345678901234567" , string(buf[:i64toa(&buf[0], 12345678901234567)]))
  45. assert.Equal(t, "123456789012345678" , string(buf[:i64toa(&buf[0], 123456789012345678)]))
  46. assert.Equal(t, "1234567890123456789" , string(buf[:i64toa(&buf[0], 1234567890123456789)]))
  47. assert.Equal(t, "9223372036854775807" , string(buf[:i64toa(&buf[0], 9223372036854775807)]))
  48. assert.Equal(t, "-1" , string(buf[:i64toa(&buf[0], -1)]))
  49. assert.Equal(t, "-12" , string(buf[:i64toa(&buf[0], -12)]))
  50. assert.Equal(t, "-123" , string(buf[:i64toa(&buf[0], -123)]))
  51. assert.Equal(t, "-1234" , string(buf[:i64toa(&buf[0], -1234)]))
  52. assert.Equal(t, "-12345" , string(buf[:i64toa(&buf[0], -12345)]))
  53. assert.Equal(t, "-123456" , string(buf[:i64toa(&buf[0], -123456)]))
  54. assert.Equal(t, "-1234567" , string(buf[:i64toa(&buf[0], -1234567)]))
  55. assert.Equal(t, "-12345678" , string(buf[:i64toa(&buf[0], -12345678)]))
  56. assert.Equal(t, "-123456789" , string(buf[:i64toa(&buf[0], -123456789)]))
  57. assert.Equal(t, "-1234567890" , string(buf[:i64toa(&buf[0], -1234567890)]))
  58. assert.Equal(t, "-12345678901" , string(buf[:i64toa(&buf[0], -12345678901)]))
  59. assert.Equal(t, "-123456789012" , string(buf[:i64toa(&buf[0], -123456789012)]))
  60. assert.Equal(t, "-1234567890123" , string(buf[:i64toa(&buf[0], -1234567890123)]))
  61. assert.Equal(t, "-12345678901234" , string(buf[:i64toa(&buf[0], -12345678901234)]))
  62. assert.Equal(t, "-123456789012345" , string(buf[:i64toa(&buf[0], -123456789012345)]))
  63. assert.Equal(t, "-1234567890123456" , string(buf[:i64toa(&buf[0], -1234567890123456)]))
  64. assert.Equal(t, "-12345678901234567" , string(buf[:i64toa(&buf[0], -12345678901234567)]))
  65. assert.Equal(t, "-123456789012345678" , string(buf[:i64toa(&buf[0], -123456789012345678)]))
  66. assert.Equal(t, "-1234567890123456789" , string(buf[:i64toa(&buf[0], -1234567890123456789)]))
  67. assert.Equal(t, "-9223372036854775808" , string(buf[:i64toa(&buf[0], -9223372036854775808)]))
  68. }
  69. func TestFastInt_UintToString(t *testing.T) {
  70. var buf [32]byte
  71. assert.Equal(t, "0" , string(buf[:u64toa(&buf[0], 0)]))
  72. assert.Equal(t, "1" , string(buf[:u64toa(&buf[0], 1)]))
  73. assert.Equal(t, "12" , string(buf[:u64toa(&buf[0], 12)]))
  74. assert.Equal(t, "123" , string(buf[:u64toa(&buf[0], 123)]))
  75. assert.Equal(t, "1234" , string(buf[:u64toa(&buf[0], 1234)]))
  76. assert.Equal(t, "12345" , string(buf[:u64toa(&buf[0], 12345)]))
  77. assert.Equal(t, "123456" , string(buf[:u64toa(&buf[0], 123456)]))
  78. assert.Equal(t, "1234567" , string(buf[:u64toa(&buf[0], 1234567)]))
  79. assert.Equal(t, "12345678" , string(buf[:u64toa(&buf[0], 12345678)]))
  80. assert.Equal(t, "123456789" , string(buf[:u64toa(&buf[0], 123456789)]))
  81. assert.Equal(t, "1234567890" , string(buf[:u64toa(&buf[0], 1234567890)]))
  82. assert.Equal(t, "12345678901" , string(buf[:u64toa(&buf[0], 12345678901)]))
  83. assert.Equal(t, "123456789012" , string(buf[:u64toa(&buf[0], 123456789012)]))
  84. assert.Equal(t, "1234567890123" , string(buf[:u64toa(&buf[0], 1234567890123)]))
  85. assert.Equal(t, "12345678901234" , string(buf[:u64toa(&buf[0], 12345678901234)]))
  86. assert.Equal(t, "123456789012345" , string(buf[:u64toa(&buf[0], 123456789012345)]))
  87. assert.Equal(t, "1234567890123456" , string(buf[:u64toa(&buf[0], 1234567890123456)]))
  88. assert.Equal(t, "12345678901234567" , string(buf[:u64toa(&buf[0], 12345678901234567)]))
  89. assert.Equal(t, "123456789012345678" , string(buf[:u64toa(&buf[0], 123456789012345678)]))
  90. assert.Equal(t, "1234567890123456789" , string(buf[:u64toa(&buf[0], 1234567890123456789)]))
  91. assert.Equal(t, "12345678901234567890" , string(buf[:u64toa(&buf[0], 12345678901234567890)]))
  92. assert.Equal(t, "18446744073709551615" , string(buf[:u64toa(&buf[0], 18446744073709551615)]))
  93. }
  94. func BenchmarkFastInt_IntToString(b *testing.B) {
  95. benchmarks := []struct {
  96. name string
  97. test func(*testing.B)
  98. }{{
  99. name: "StdLib-Positive",
  100. test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { strconv.AppendInt(buf[:0], int64(i), 10) }},
  101. }, {
  102. name: "StdLib-Negative",
  103. test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { strconv.AppendInt(buf[:0], -int64(i), 10) }},
  104. }, {
  105. name: "FastInt-Positive",
  106. test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { i64toa(&buf[0], int64(i)) }},
  107. }, {
  108. name: "FastInt-Negative",
  109. test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { i64toa(&buf[0], -int64(i)) }},
  110. }}
  111. for _, bm := range benchmarks {
  112. b.Run(bm.name, bm.test)
  113. }
  114. }
  115. type utoaBench struct {
  116. name string
  117. num uint64
  118. }
  119. func BenchmarkFastInt_UintToString(b *testing.B) {
  120. maxUint := "18446744073709551615"
  121. benchs := make([]utoaBench, len(maxUint) + 1)
  122. benchs[0].name = "Zero"
  123. benchs[0].num = 0
  124. for i := 1; i <= len(maxUint); i++ {
  125. benchs[i].name = strconv.FormatInt(int64(i), 10) + "-Digs"
  126. benchs[i].num, _ = strconv.ParseUint(string(maxUint[:i]), 10, 64)
  127. }
  128. for _, t := range(benchs) {
  129. benchmarks := []struct {
  130. name string
  131. test func(*testing.B)
  132. }{{
  133. name: "StdLib",
  134. test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { strconv.AppendUint(buf[:0], t.num, 10) }},
  135. }, {
  136. name: "FastInt",
  137. test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { u64toa(&buf[0], t.num) }},
  138. }}
  139. for _, bm := range benchmarks {
  140. name := fmt.Sprintf("%s_%s", bm.name, t.name)
  141. b.Run(name, bm.test)
  142. }
  143. }
  144. }