dl
dl_tester.h
浏览该文件的文档.
1
12#pragma once
13
14
15namespace dl
16{
18 constexpr double DL_TESTER_TIME = 0.2;
19
21{
22 std::string _name;
23 size_t _numHigh;
24 size_t _numLow;
25
27 _name{"no_name"},
28 _numHigh{0},
29 _numLow{0}
30 { }
31 bool IsFailed() { return _numLow == 0 && _numHigh == 0; }
32};
33
34class Tester
35{
36public:
37 Tester(std::string_view name) :
38 _name{ name },
39 _ret{false}
40 {
41 }
42
43 operator bool()
44 {
45 return _ret;
46 }
47
49 template <typename F>
50 void AddTestOnce(std::string_view name, F func)
51 {
52 _ret = func(0, 0);
53 if (!_ret)
54 {
56 ins._name = name;
57 _vec.push_back(ins);
58 return;
59 }
61 ins._name = name;
62 ins._numHigh = 1;
63 ins._numLow = 1;
64 _vec.push_back(ins);
65 }
66
68 template <typename F>
69 void AddTest(std::string_view name, F func)
70 {
71 //防止优化的变量
72 float out = 0;
73 //先执行n次,计算1s可以计算多少次
74 size_t num_low = 1, num_high = 1;
75
76
77 double t0, t1;
78
79 do
80 {
81 if (num_low == Math::Pow(2, 63))
82 {
83 ++num_high;
84 if (num_high == 0)
85 {//溢出说明表达式太快了
86 num_low = 0;
87 break;
88 }
89 }
90 else
91 num_low *= 2;
92
93
94 t0 = g_time->GetCurrent();
95 for (size_t j = 0; j != num_high; ++j)
96 {
97 for (size_t i = 0; i != num_low; ++i)
98 {
99 _ret = func(i, out);
100 if (!_ret)
101 {
102 TesterInstance ins;
103 ins._name = name;
104 _vec.push_back(ins);
105 return;
106 }
107 }
108 }
109
110 t1 = g_time->GetCurrent();
111 } while (t1 - t0 < DL_TESTER_TIME);//直到大于1s
112
113
114 //-----------------------------------------------------------------------
115
116 t0 = g_time->GetCurrent();
117 for (size_t j = 0; j != num_high; ++j)
118 {
119 for (size_t i = 0; i != num_low; ++i)
120 {
121 _ret = func(i, out);
122 if (!_ret)
123 {
124 TesterInstance ins;
125 ins._name = name;
126 _vec.push_back(ins);
127 return;
128 }
129 }
130 }
131 t1 = g_time->GetCurrent();
132
133 TesterInstance ins;
134 ins._name = name;
135 ins._numHigh = size_t(round(num_high / (t1 - t0)));
136 ins._numLow = size_t(num_low / (t1 - t0));
137 _vec.push_back(ins);
138
139 std::string str = to_string(out);
140 str.resize(0);
141 }
142
143 void PrintAll()
144 {
145 std::string str;
146 str += fmt::format("{:-^28}\n", _name);
147
148 for (size_t i = 0; i != _vec.size(); ++i)
149 {
150 auto& iter = _vec[i];
151 std::string name = iter._name + ": ";
152 name.resize(18, ' ');
153
154 if (iter.IsFailed())
155 str += name + "失败!\n";
156 else
157 str += fmt::format("{}{} x {}(n/s)\n", name,
158 iter._numHigh, iter._numLow);
159 }
160 log_test0(str);
161 }
162private:
163 std::string _name;
164 std::vector<TesterInstance> _vec;
165 bool _ret;
166};
167}
void AddTestOnce(std::string_view name, F func)
单次执行测试
void AddTest(std::string_view name, F func)
时间内执行
Tester(std::string_view name)
constexpr T Pow(T x, T n)
返回x的n次方
constexpr double DL_TESTER_TIME
测试时间
void log_test0(std::string_view str, DL_SOURCE_LOCATION)
std::string to_string(T v)
to_string包装
Time * g_time