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