Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[locale] Avoid copy of __atoms when char_type is char
The function num_get<_CharT>::stage2_int_prep makes unnecessary copy of src into atoms when char_type is char. This can be avoided by creating a switch on type and just returning __src when char_type is char. Added the test case to demonstrate performance improvement. In order to avoid ABI incompatibilities, the changes are guarded with a macro _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET Differential Revision: https://reviews.llvm.org/D30268 Reviewed by: EricWF llvm-svn: 305427
- Loading branch information
Showing
3 changed files
with
107 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
#include "benchmark/benchmark_api.h" | ||
|
||
#include <sstream> | ||
double __attribute__((noinline)) istream_numbers(); | ||
|
||
double istream_numbers() { | ||
const char *a[] = { | ||
"-6 69 -71 2.4882e-02 -100 101 -2.00005 5000000 -50000000", | ||
"-25 71 7 -9.3262e+01 -100 101 -2.00005 5000000 -50000000", | ||
"-14 53 46 -6.7026e-02 -100 101 -2.00005 5000000 -50000000" | ||
}; | ||
|
||
int a1, a2, a3, a4, a5, a6, a7; | ||
double f1 = 0.0, f2 = 0.0, q = 0.0; | ||
for (int i=0; i < 3; i++) { | ||
std::istringstream s(a[i]); | ||
s >> a1 | ||
>> a2 | ||
>> a3 | ||
>> f1 | ||
>> a4 | ||
>> a5 | ||
>> f2 | ||
>> a6 | ||
>> a7; | ||
q += (a1 + a2 + a3 + a4 + a5 + a6 + a7 + f1 + f2)/1000000; | ||
} | ||
return q; | ||
} | ||
|
||
static void BM_Istream_numbers(benchmark::State &state) { | ||
double i = 0; | ||
while (state.KeepRunning()) | ||
benchmark::DoNotOptimize(i += istream_numbers()); | ||
} | ||
|
||
BENCHMARK(BM_Istream_numbers)->RangeMultiplier(2)->Range(1024, 4096); | ||
BENCHMARK_MAIN() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters