• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (C) 2017 The Android Open Source Project
3   *
4   * Licensed under the Apache License, Version 2.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *      http://www.apache.org/licenses/LICENSE-2.0
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  #include <err.h>
18  #include <langinfo.h>
19  #include <locale.h>
20  #include <stdlib.h>
21  
22  #include <benchmark/benchmark.h>
23  #include "util.h"
24  
BM_stdlib_malloc_free(benchmark::State & state)25  static void BM_stdlib_malloc_free(benchmark::State& state) {
26    const size_t nbytes = state.range(0);
27  
28    void* c;
29    while (state.KeepRunning()) {
30      c = malloc(nbytes);
31      free(c);
32    }
33  
34    state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
35  }
36  BIONIC_BENCHMARK_WITH_ARG(BM_stdlib_malloc_free, "AT_COMMON_SIZES");
37  
BM_stdlib_mbstowcs(benchmark::State & state)38  static void BM_stdlib_mbstowcs(benchmark::State& state) {
39    const size_t buf_alignment = state.range(0);
40    const size_t widebuf_alignment = state.range(1);
41  
42    std::vector<char> buf;
43    std::vector<wchar_t> widebuf;
44  
45    setlocale(LC_CTYPE, "C.UTF-8")
46    || setlocale(LC_CTYPE, "en_US.UTF-8")
47    || setlocale(LC_CTYPE, "en_GB.UTF-8")
48    || setlocale(LC_CTYPE, "en.UTF-8")
49    || setlocale(LC_CTYPE, "de_DE-8")
50    || setlocale(LC_CTYPE, "fr_FR-8");
51    if (strcmp(nl_langinfo(CODESET), "UTF-8")) {
52      errx(1, "ERROR: unable to set locale in BM_stdlib_mbstowcs");
53    }
54  
55    char* buf_aligned = GetAlignedPtr(&buf, buf_alignment, 500000);
56    wchar_t* widebuf_aligned = GetAlignedPtr(&widebuf, widebuf_alignment, 500000);
57    size_t i, j, k, l;
58    l = 0;
59    for (i=0xc3; i<0xe0; i++)
60      for (j=0x80; j<0xc0; j++)
61        buf[l++] = i, buf[l++] = j;
62    for (i=0xe1; i<0xed; i++)
63      for (j=0x80; j<0xc0; j++)
64        for (k=0x80; k<0xc0; k++)
65          buf[l++] = i, buf[l++] = j, buf[l++] = k;
66    for (i=0xf1; i<0xf4; i++)
67      for (j=0x80; j<0xc0; j++)
68        for (k=0x80; k<0xc0; k++)
69          buf[l++] = i, buf[l++] = j, buf[l++] = 0x80, buf[l++] = k;
70    buf[l++] = 0;
71  
72    volatile size_t c __attribute__((unused)) = 0;
73    while (state.KeepRunning()) {
74      c = mbstowcs(widebuf_aligned, buf_aligned, 500000);
75    }
76  
77    state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(500000));
78  }
79  BIONIC_BENCHMARK_WITH_ARG(BM_stdlib_mbstowcs, "0 0");
80  
BM_stdlib_mbrtowc(benchmark::State & state)81  static void BM_stdlib_mbrtowc(benchmark::State& state) {
82    const size_t buf_alignment = state.range(0);
83  
84    std::vector<char> buf;
85  
86    setlocale(LC_CTYPE, "C.UTF-8")
87    || setlocale(LC_CTYPE, "en_US.UTF-8")
88    || setlocale(LC_CTYPE, "en_GB.UTF-8")
89    || setlocale(LC_CTYPE, "en.UTF-8")
90    || setlocale(LC_CTYPE, "de_DE-8")
91    || setlocale(LC_CTYPE, "fr_FR-8");
92    if (strcmp(nl_langinfo(CODESET), "UTF-8")) {
93      errx(1, "ERROR: unable to set locale in BM_stdlib_mbrtowc");
94    }
95  
96    char* buf_aligned = GetAlignedPtr(&buf, buf_alignment, 500000);
97    size_t i, j, k, l;
98    l = 0;
99    for (i=0xc3; i<0xe0; i++)
100      for (j=0x80; j<0xc0; j++)
101        buf[l++] = i, buf[l++] = j;
102    for (i=0xe1; i<0xed; i++)
103      for (j=0x80; j<0xc0; j++)
104        for (k=0x80; k<0xc0; k++)
105          buf[l++] = i, buf[l++] = j, buf[l++] = k;
106    for (i=0xf1; i<0xf4; i++)
107      for (j=0x80; j<0xc0; j++)
108        for (k=0x80; k<0xc0; k++)
109          buf[l++] = i, buf[l++] = j, buf[l++] = 0x80, buf[l++] = k;
110    buf[l++] = 0;
111  
112    wchar_t wc = 0;
113    while (state.KeepRunning()) {
114      for (j = 0; buf_aligned[j]; j+=mbrtowc(&wc, buf_aligned + j, 4, NULL)) {
115      }
116    }
117  
118    state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(500000));
119  }
120  BIONIC_BENCHMARK_WITH_ARG(BM_stdlib_mbrtowc, "0");
121  
BM_stdlib_atoi(benchmark::State & state)122  void BM_stdlib_atoi(benchmark::State& state) {
123    while (state.KeepRunning()) {
124      benchmark::DoNotOptimize(atoi(" -123"));
125    }
126  }
127  BIONIC_BENCHMARK(BM_stdlib_atoi);
128  
BM_stdlib_atol(benchmark::State & state)129  void BM_stdlib_atol(benchmark::State& state) {
130    while (state.KeepRunning()) {
131      benchmark::DoNotOptimize(atol(" -123"));
132    }
133  }
134  BIONIC_BENCHMARK(BM_stdlib_atol);
135  
BM_stdlib_strtol(benchmark::State & state)136  void BM_stdlib_strtol(benchmark::State& state) {
137    while (state.KeepRunning()) {
138      benchmark::DoNotOptimize(strtol(" -123", nullptr, 0));
139    }
140  }
141  BIONIC_BENCHMARK(BM_stdlib_strtol);
142  
BM_stdlib_strtoll(benchmark::State & state)143  void BM_stdlib_strtoll(benchmark::State& state) {
144    while (state.KeepRunning()) {
145      benchmark::DoNotOptimize(strtoll(" -123", nullptr, 0));
146    }
147  }
148  BIONIC_BENCHMARK(BM_stdlib_strtoll);
149  
BM_stdlib_strtoul(benchmark::State & state)150  void BM_stdlib_strtoul(benchmark::State& state) {
151    while (state.KeepRunning()) {
152      benchmark::DoNotOptimize(strtoul(" -123", nullptr, 0));
153    }
154  }
155  BIONIC_BENCHMARK(BM_stdlib_strtoul);
156  
BM_stdlib_strtoull(benchmark::State & state)157  void BM_stdlib_strtoull(benchmark::State& state) {
158    while (state.KeepRunning()) {
159      benchmark::DoNotOptimize(strtoull(" -123", nullptr, 0));
160    }
161  }
162  BIONIC_BENCHMARK(BM_stdlib_strtoull);
163