cannam@48
|
1 // Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
|
cannam@48
|
2 // Licensed under the MIT License:
|
cannam@48
|
3 //
|
cannam@48
|
4 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
cannam@48
|
5 // of this software and associated documentation files (the "Software"), to deal
|
cannam@48
|
6 // in the Software without restriction, including without limitation the rights
|
cannam@48
|
7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
cannam@48
|
8 // copies of the Software, and to permit persons to whom the Software is
|
cannam@48
|
9 // furnished to do so, subject to the following conditions:
|
cannam@48
|
10 //
|
cannam@48
|
11 // The above copyright notice and this permission notice shall be included in
|
cannam@48
|
12 // all copies or substantial portions of the Software.
|
cannam@48
|
13 //
|
cannam@48
|
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
cannam@48
|
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
cannam@48
|
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
cannam@48
|
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
cannam@48
|
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
cannam@48
|
19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
cannam@48
|
20 // THE SOFTWARE.
|
cannam@48
|
21
|
cannam@48
|
22 #include "carsales.capnp.h"
|
cannam@48
|
23 #include "capnproto-common.h"
|
cannam@48
|
24
|
cannam@48
|
25 namespace capnp {
|
cannam@48
|
26 namespace benchmark {
|
cannam@48
|
27 namespace capnp {
|
cannam@48
|
28
|
cannam@48
|
29 template <typename ReaderOrBuilder>
|
cannam@48
|
30 uint64_t carValue(ReaderOrBuilder car) {
|
cannam@48
|
31 // Do not think too hard about realism.
|
cannam@48
|
32
|
cannam@48
|
33 uint64_t result = 0;
|
cannam@48
|
34
|
cannam@48
|
35 result += car.getSeats() * 200;
|
cannam@48
|
36 result += car.getDoors() * 350;
|
cannam@48
|
37 for (auto wheel: car.getWheels()) {
|
cannam@48
|
38 result += wheel.getDiameter() * wheel.getDiameter();
|
cannam@48
|
39 result += wheel.getSnowTires() ? 100 : 0;
|
cannam@48
|
40 }
|
cannam@48
|
41
|
cannam@48
|
42 result += car.getLength() * car.getWidth() * car.getHeight() / 50;
|
cannam@48
|
43
|
cannam@48
|
44 auto engine = car.getEngine();
|
cannam@48
|
45 result += engine.getHorsepower() * 40;
|
cannam@48
|
46 if (engine.getUsesElectric()) {
|
cannam@48
|
47 if (engine.getUsesGas()) {
|
cannam@48
|
48 // hybrid
|
cannam@48
|
49 result += 5000;
|
cannam@48
|
50 } else {
|
cannam@48
|
51 result += 3000;
|
cannam@48
|
52 }
|
cannam@48
|
53 }
|
cannam@48
|
54
|
cannam@48
|
55 result += car.getHasPowerWindows() ? 100 : 0;
|
cannam@48
|
56 result += car.getHasPowerSteering() ? 200 : 0;
|
cannam@48
|
57 result += car.getHasCruiseControl() ? 400 : 0;
|
cannam@48
|
58 result += car.getHasNavSystem() ? 2000 : 0;
|
cannam@48
|
59
|
cannam@48
|
60 result += car.getCupHolders() * 25;
|
cannam@48
|
61
|
cannam@48
|
62 return result;
|
cannam@48
|
63 }
|
cannam@48
|
64
|
cannam@48
|
65 void randomCar(Car::Builder car) {
|
cannam@48
|
66 // Do not think too hard about realism.
|
cannam@48
|
67
|
cannam@48
|
68 static const char* const MAKES[] = { "Toyota", "GM", "Ford", "Honda", "Tesla" };
|
cannam@48
|
69 static const char* const MODELS[] = { "Camry", "Prius", "Volt", "Accord", "Leaf", "Model S" };
|
cannam@48
|
70
|
cannam@48
|
71 car.setMake(MAKES[fastRand(sizeof(MAKES) / sizeof(MAKES[0]))]);
|
cannam@48
|
72 car.setModel(MODELS[fastRand(sizeof(MODELS) / sizeof(MODELS[0]))]);
|
cannam@48
|
73
|
cannam@48
|
74 car.setColor((Color)fastRand((uint)Color::SILVER + 1));
|
cannam@48
|
75 car.setSeats(2 + fastRand(6));
|
cannam@48
|
76 car.setDoors(2 + fastRand(3));
|
cannam@48
|
77
|
cannam@48
|
78 for (auto wheel: car.initWheels(4)) {
|
cannam@48
|
79 wheel.setDiameter(25 + fastRand(15));
|
cannam@48
|
80 wheel.setAirPressure(30 + fastRandDouble(20));
|
cannam@48
|
81 wheel.setSnowTires(fastRand(16) == 0);
|
cannam@48
|
82 }
|
cannam@48
|
83
|
cannam@48
|
84 car.setLength(170 + fastRand(150));
|
cannam@48
|
85 car.setWidth(48 + fastRand(36));
|
cannam@48
|
86 car.setHeight(54 + fastRand(48));
|
cannam@48
|
87 car.setWeight(car.getLength() * car.getWidth() * car.getHeight() / 200);
|
cannam@48
|
88
|
cannam@48
|
89 auto engine = car.initEngine();
|
cannam@48
|
90 engine.setHorsepower(100 * fastRand(400));
|
cannam@48
|
91 engine.setCylinders(4 + 2 * fastRand(3));
|
cannam@48
|
92 engine.setCc(800 + fastRand(10000));
|
cannam@48
|
93 engine.setUsesGas(true);
|
cannam@48
|
94 engine.setUsesElectric(fastRand(2));
|
cannam@48
|
95
|
cannam@48
|
96 car.setFuelCapacity(10.0 + fastRandDouble(30.0));
|
cannam@48
|
97 car.setFuelLevel(fastRandDouble(car.getFuelCapacity()));
|
cannam@48
|
98 car.setHasPowerWindows(fastRand(2));
|
cannam@48
|
99 car.setHasPowerSteering(fastRand(2));
|
cannam@48
|
100 car.setHasCruiseControl(fastRand(2));
|
cannam@48
|
101 car.setCupHolders(fastRand(12));
|
cannam@48
|
102 car.setHasNavSystem(fastRand(2));
|
cannam@48
|
103 }
|
cannam@48
|
104
|
cannam@48
|
105 class CarSalesTestCase {
|
cannam@48
|
106 public:
|
cannam@48
|
107 typedef ParkingLot Request;
|
cannam@48
|
108 typedef TotalValue Response;
|
cannam@48
|
109 typedef uint64_t Expectation;
|
cannam@48
|
110
|
cannam@48
|
111 static uint64_t setupRequest(ParkingLot::Builder request) {
|
cannam@48
|
112 uint64_t result = 0;
|
cannam@48
|
113 for (auto car: request.initCars(fastRand(200))) {
|
cannam@48
|
114 randomCar(car);
|
cannam@48
|
115 result += carValue(car);
|
cannam@48
|
116 }
|
cannam@48
|
117 return result;
|
cannam@48
|
118 }
|
cannam@48
|
119 static void handleRequest(ParkingLot::Reader request, TotalValue::Builder response) {
|
cannam@48
|
120 uint64_t result = 0;
|
cannam@48
|
121 for (auto car: request.getCars()) {
|
cannam@48
|
122 result += carValue(car);
|
cannam@48
|
123 }
|
cannam@48
|
124 response.setAmount(result);
|
cannam@48
|
125 }
|
cannam@48
|
126 static inline bool checkResponse(TotalValue::Reader response, uint64_t expected) {
|
cannam@48
|
127 return response.getAmount() == expected;
|
cannam@48
|
128 }
|
cannam@48
|
129 };
|
cannam@48
|
130
|
cannam@48
|
131 } // namespace capnp
|
cannam@48
|
132 } // namespace benchmark
|
cannam@48
|
133 } // namespace capnp
|
cannam@48
|
134
|
cannam@48
|
135 int main(int argc, char* argv[]) {
|
cannam@48
|
136 return capnp::benchmark::benchmarkMain<
|
cannam@48
|
137 capnp::benchmark::capnp::BenchmarkTypes,
|
cannam@48
|
138 capnp::benchmark::capnp::CarSalesTestCase>(argc, argv);
|
cannam@48
|
139 }
|