annotate src/capnproto-0.6.0/c++/src/benchmark/capnproto-carsales.c++ @ 147:45360b968bf4

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