[Linux] Port MallocBench
[WebKit-https.git] / PerformanceTests / MediaTime / main.cpp
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include <chrono>
27 #include <random>
28 #include <set>
29 #include <wtf/MediaTime.h>
30
31 using namespace std;
32 using namespace std::chrono;
33
34 static const size_t setSize = 100000;
35
36 void performTest(const char* name, function<void()> test)
37 {
38     vector<double> runtimes(21);
39     for (auto& runtime : runtimes) {
40         auto start = steady_clock::now();
41         test();
42         runtime = duration_cast<milliseconds>(steady_clock::now() - start).count();
43     }
44     sort(runtimes.begin(), runtimes.end());
45     double sum = std::accumulate(runtimes.begin(), runtimes.end(), 0);
46     double mean = sum / runtimes.size();
47     double median = runtimes[(runtimes.size() + 1) / 2];
48     double min = runtimes.front();
49     double max = runtimes.back();
50     double sqSum = std::inner_product(runtimes.begin(), runtimes.end(), runtimes.begin(), 0);
51     double stdev = std::sqrt(sqSum / runtimes.size() - mean * mean);
52
53     printf("RESULT %s: Time= %g ms", name, sum);
54     printf("median= %g ms, stdev= %g ms, min= %g ms, max = %g ms", median, stdev, min, max);
55 }
56
57 void test(int32_t count, function<MediaTime(int32_t)> generator)
58 {
59     set<MediaTime> times;
60
61     for (int32_t i = 0; i < count; ++i)
62         times.insert(generator(i));
63
64     for (int32_t i = 0; i < count; ++i)
65         times.upper_bound(generator(i));
66 }
67
68 int main(int argc, const char * argv[])
69 {
70     performTest("Equal TimeScales", [] { test(setSize, [] (int32_t i) { return MediaTime(i, 1); }); });
71     performTest("Equal TimeValues", [] { test(setSize, [] (int32_t i) { return MediaTime(1, i + 1); }); });
72     performTest("Disparate TimeValues & TimeScales", [] { test(setSize, [] (int32_t i) { return MediaTime(i, i + 1); }); });
73     performTest("Non-uniform", [] {
74         test(setSize, [] (int32_t i) {
75             switch (i % 6) {
76             case 0:
77                 return MediaTime::invalidTime();
78             case 1:
79                 return MediaTime::positiveInfiniteTime();
80             case 2:
81                 return MediaTime::negativeInfiniteTime();
82             case 3:
83                 return MediaTime::indefiniteTime();
84             case 4:
85                 return MediaTime(i, 1);
86             case 5:
87             default:
88                 return MediaTime(i, i + 1);
89             }
90         });
91     });
92
93     return 0;
94 }