fastint_test.tmpl 8.2 KB

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