File: elem.cpp

package info (click to toggle)
gemmi 0.5.7%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 5,344 kB
  • sloc: cpp: 48,972; python: 4,352; ansic: 3,428; sh: 302; makefile: 69; f90: 42; javascript: 12
file content (65 lines) | stat: -rw-r--r-- 2,120 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// Copyright 2017 Global Phasing Ltd.

// Microbenchmark of gemmi::find_element().
// Requires the google/benchmark library. It can be built manually:
// c++ -Wall -O2 -I../include -I$GB/include elem.cpp $GB/src/libbenchmark.a -pthread

#include "gemmi/elem.hpp"
#include "gemmi/fprime.hpp"
#include <stdlib.h> // for rand
#include <benchmark/benchmark.h>

inline void run(benchmark::State& state, const char (&el)[10][3]) {
  while (state.KeepRunning())
    for (int i = 0; i != 10; ++i)
      benchmark::DoNotOptimize(gemmi::find_element(el[i]));
}

static void pyridoxine_elements(benchmark::State& state) {
  constexpr char el[10][3] =
      { "C", "C", "N", "C", "C", "C", "C", "O", "C", "O", /*"C", "O"*/ };
  run(state, el);
}

static void common_elements(benchmark::State& state) {
  constexpr char el[10][3] =
      { "C", "N", "O", "S", "Mg", "C", "C", "O", "H", "N" };
  run(state, el);
}

static void various_elements(benchmark::State& state) {
  constexpr char el[10][3] =
      { "Se", "C", "Mg", "P", "Br", "Cl", "C", "O", "Ca", "Si" };
  run(state, el);
}

static void heavy_elements(benchmark::State& state) {
  constexpr char el[10][3] =
      { "Se", "Pb", "Au", "Hg", "Br", "Po", "W", "Ag", "U", "Og" };
  run(state, el);
}

static void run_fprime(benchmark::State& state) {
  const double energy = 12398.4197386209 / (0.5 + (double)rand() / RAND_MAX);
  while (state.KeepRunning())
    for (int i = 3; i != 50; ++i)
      benchmark::DoNotOptimize(gemmi::cromer_liberman(i, energy, nullptr));
}

BENCHMARK(pyridoxine_elements);
BENCHMARK(common_elements);
BENCHMARK(various_elements);
BENCHMARK(heavy_elements);
BENCHMARK(run_fprime);
BENCHMARK_MAIN();

/* Output from my desktop:

-----------------------------------------------------------
Benchmark                    Time           CPU Iterations
-----------------------------------------------------------
pyridoxine_elements         11 ns         11 ns   64656977
common_elements             16 ns         16 ns   43586668
various_elements            86 ns         86 ns    8055870
heavy_elements             332 ns        332 ns    2142365
*/