annotate 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
rev   line source
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 }