#include <cstdio>
#include <iostream>
#include <map>
#include <limits>
#include "windows.h"
using namespace std;
int main()
{
LARGE_INTEGER tmp_buffer;
double freq;
double ns_per_tick;
if (!QueryPerformanceFrequency(&tmp_buffer))
cout << "QueryPerformanceFrequency failed\n";
freq = (double)tmp_buffer.QuadPart;
ns_per_tick = 1E9 / freq;
cout << "cpu freq = " << ns_per_tick << "ns" << endl;
int count = 1000 * 1000;
map<__int64, int> ccnt;
__int64 ft_wait;
__int64 min_wait = LLONG_MAX;
__int64 max_wait = LLONG_MIN;
cout << "Wait time (ns): ";
cin >> ft_wait;
ft_wait /= ns_per_tick;
for (size_t i = 0; i < count; i++)
{
__int64 ft_beg, ft_end;
__int64 ft_current;
QueryPerformanceCounter(&tmp_buffer);
ft_beg = tmp_buffer.QuadPart;
do
{
QueryPerformanceCounter(&tmp_buffer);
ft_current = tmp_buffer.QuadPart;
} while ((ft_current - ft_beg) < ft_wait);
ft_end = ft_current;
__int64 ft_real_wait = ft_end - ft_beg;
min_wait = min_wait > ft_real_wait ? ft_real_wait : min_wait;
max_wait = max_wait < ft_real_wait ? ft_real_wait : max_wait;
if (ccnt.find(ft_real_wait) != ccnt.end())
ccnt[ft_real_wait]++;
else
ccnt.insert(pair<__int64, int>(ft_real_wait, 1));
}
for (auto i = ccnt.begin(); i != ccnt.end(); ++i)
cout << "計時長度" << (int)(i->first * ns_per_tick) << "發生 " << i->second << " 次" << endl;
cout << "計數次數" << count << " 次" << endl;
cout << "最小計時長度" << min_wait * ns_per_tick << "ns" << endl;
cout << "最大計時長度" << max_wait * ns_per_tick << "ns" << endl;
getchar();
getchar();
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8bGltaXRzPgoKI2luY2x1ZGUgIndpbmRvd3MuaCIKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpCnsKCUxBUkdFX0lOVEVHRVIgdG1wX2J1ZmZlcjsKCglkb3VibGUgZnJlcTsKCWRvdWJsZSBuc19wZXJfdGljazsKCglpZiAoIVF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJnRtcF9idWZmZXIpKQoJCWNvdXQgPDwgIlF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3kgZmFpbGVkXG4iOyAKCglmcmVxID0gKGRvdWJsZSl0bXBfYnVmZmVyLlF1YWRQYXJ0OwoJbnNfcGVyX3RpY2sgPSAxRTkgLyBmcmVxOwoJY291dCA8PCAiY3B1IGZyZXEgPSAiIDw8IG5zX3Blcl90aWNrIDw8ICJucyIgPDwgZW5kbDsKCglpbnQgY291bnQgPSAxMDAwICogMTAwMDsKCW1hcDxfX2ludDY0LCBpbnQ+IGNjbnQ7CglfX2ludDY0IGZ0X3dhaXQ7CglfX2ludDY0IG1pbl93YWl0ID0gTExPTkdfTUFYOwoJX19pbnQ2NCBtYXhfd2FpdCA9IExMT05HX01JTjsKCgljb3V0IDw8ICJXYWl0IHRpbWUgKG5zKTogIjsKCWNpbiA+PiBmdF93YWl0OwoJZnRfd2FpdCAvPSBuc19wZXJfdGljazsKCglmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspCgl7CgkJX19pbnQ2NCBmdF9iZWcsIGZ0X2VuZDsKCQlfX2ludDY0IGZ0X2N1cnJlbnQ7CgoJCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZ0bXBfYnVmZmVyKTsKCQlmdF9iZWcgPSB0bXBfYnVmZmVyLlF1YWRQYXJ0OwoKCQlkbwoJCXsKCQkJUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJnRtcF9idWZmZXIpOwoJCQlmdF9jdXJyZW50ID0gdG1wX2J1ZmZlci5RdWFkUGFydDsKCQl9IHdoaWxlICgoZnRfY3VycmVudCAtIGZ0X2JlZykgPCBmdF93YWl0KTsKCgkJZnRfZW5kID0gZnRfY3VycmVudDsKCQlfX2ludDY0IGZ0X3JlYWxfd2FpdCA9IGZ0X2VuZCAtIGZ0X2JlZzsKCQkKCQltaW5fd2FpdCA9IG1pbl93YWl0ID4gZnRfcmVhbF93YWl0ID8gZnRfcmVhbF93YWl0IDogbWluX3dhaXQ7CgkJbWF4X3dhaXQgPSBtYXhfd2FpdCA8IGZ0X3JlYWxfd2FpdCA/IGZ0X3JlYWxfd2FpdCA6IG1heF93YWl0OwoKCQlpZiAoY2NudC5maW5kKGZ0X3JlYWxfd2FpdCkgIT0gY2NudC5lbmQoKSkKCQkJY2NudFtmdF9yZWFsX3dhaXRdKys7CgkJZWxzZQoJCQljY250Lmluc2VydChwYWlyPF9faW50NjQsIGludD4oZnRfcmVhbF93YWl0LCAxKSk7Cgl9CgoJZm9yIChhdXRvIGkgPSBjY250LmJlZ2luKCk7IGkgIT0gY2NudC5lbmQoKTsgKytpKQoJCWNvdXQgPDwgIuioiOaZgumVt+W6piIgPDwgKGludCkoaS0+Zmlyc3QgKiBuc19wZXJfdGljaykgPDwgIueZvOeUnyAiIDw8IGktPnNlY29uZCA8PCAiIOasoSIgPDwgZW5kbDsKCgljb3V0IDw8ICLoqIjmlbjmrKHmlbgiIDw8IGNvdW50IDw8ICIg5qyhIiA8PCBlbmRsOwoJY291dCA8PCAi5pyA5bCP6KiI5pmC6ZW35bqmIiA8PCBtaW5fd2FpdCAqIG5zX3Blcl90aWNrIDw8ICJucyIgPDwgZW5kbDsKCWNvdXQgPDwgIuacgOWkp+ioiOaZgumVt+W6piIgPDwgbWF4X3dhaXQgKiBuc19wZXJfdGljayA8PCAibnMiIDw8IGVuZGw7CgoJZ2V0Y2hhcigpOwoJZ2V0Y2hhcigpOwp9