| /* |
| * Copyright 2015 Facebook, Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <folly/Benchmark.h> |
| #include <folly/Range.h> |
| |
| #include <algorithm> |
| |
| using namespace std; |
| using namespace folly; |
| |
| string lorem_ipsum = |
| "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam" |
| "lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam" |
| "viverra nec consectetur ante hendrerit. Donec et mollis" |
| "dolor. Praesent et diam eget libero egestas mattis sit amet vitae" |
| "augue. Nam tincidunt congue enim, ut porta lorem lacinia" |
| "consectetur. Donec ut libero sed arcu vehicula ultricies a non" |
| "tortor. Lorem ipsum dolor sit amet, consectetur adipiscing" |
| "elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed," |
| "adipiscing id dolor. Pellentesque auctor nisi id magna consequat" |
| "sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt" |
| "feugiat nisl imperdiet. Ut convallis libero in urna ultrices" |
| "accumsan. Donec sed odio eros. Donec viverra mi quis quam pulvinar at" |
| "malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis" |
| "parturient montes, nascetur ridiculus mus. In rutrum accumsan" |
| "ultricies. Mauris vitae nisi at sem facilisis semper ac in est." |
| "\n" |
| "Vivamus fermentum semper porta. Nunc diam velit, adipiscing ut" |
| "tristique vitae, sagittis vel odio. Maecenas convallis ullamcorper" |
| "ultricies. Curabitur ornare, ligula semper consectetur sagittis, nisi" |
| "diam iaculis velit, id fringilla sem nunc vel mi. Nam dictum, odio nec" |
| "pretium volutpat, arcu ante placerat erat, non tristique elit urna et" |
| "turpis. Quisque mi metus, ornare sit amet fermentum et, tincidunt et" |
| "orci. Fusce eget orci a orci congue vestibulum. Ut dolor diam," |
| "elementum et vestibulum eu, porttitor vel elit. Curabitur venenatis" |
| "pulvinar tellus gravida ornare. Sed et erat faucibus nunc euismod" |
| "ultricies ut id justo. Nullam cursus suscipit nisi, et ultrices justo" |
| "sodales nec. Fusce venenatis facilisis lectus ac semper. Aliquam at" |
| "massa ipsum. Quisque bibendum purus convallis nulla ultrices" |
| "ultricies. Nullam aliquam, mi eu aliquam tincidunt, purus velit" |
| "laoreet tortor, viverra pretium nisi quam vitae mi. Fusce vel volutpat" |
| "elit. Nam sagittis nisi dui." |
| "\n" |
| "Suspendisse lectus leo, consectetur in tempor sit amet, placerat quis" |
| "neque. Etiam luctus porttitor lorem, sed suscipit est rutrum" |
| "non. Curabitur lobortis nisl a enim congue semper. Aenean commodo" |
| "ultrices imperdiet. Vestibulum ut justo vel sapien venenatis" |
| "tincidunt. Phasellus eget dolor sit amet ipsum dapibus condimentum" |
| "vitae quis lectus. Aliquam ut massa in turpis dapibus" |
| "convallis. Praesent elit lacus, vestibulum at malesuada et, ornare et" |
| "est. Ut augue nunc, sodales ut euismod non, adipiscing vitae" |
| "orci. Mauris ut placerat justo. Mauris in ultricies enim. Quisque nec" |
| "est eleifend nulla ultrices egestas quis ut quam. Donec sollicitudin" |
| "lectus a mauris pulvinar id aliquam urna cursus. Cras quis ligula sem," |
| "vel elementum mi. Phasellus non ullamcorper urna." |
| "\n" |
| "Class aptent taciti sociosqu ad litora torquent per conubia nostra," |
| "per inceptos himenaeos. In euismod ultrices facilisis. Vestibulum" |
| "porta sapien adipiscing augue congue id pretium lectus molestie. Proin" |
| "quis dictum nisl. Morbi id quam sapien, sed vestibulum sem. Duis" |
| "elementum rutrum mauris sed convallis. Proin vestibulum magna" |
| "mi. Aenean tristique hendrerit magna, ac facilisis nulla hendrerit" |
| "ut. Sed non tortor sodales quam auctor elementum. Donec hendrerit nunc" |
| "eget elit pharetra pulvinar. Suspendisse id tempus tortor. Aenean" |
| "luctus, elit commodo laoreet commodo, justo nisi consequat massa, sed" |
| "vulputate quam urna quis eros. Donec vel." |
| "\n"; |
| |
| const string needle = "commodo"; |
| |
| // legacy implementation |
| struct AsciiCaseInsensitiveLegacy { |
| bool operator()(char lhs, char rhs) const { |
| return toupper(lhs) == toupper(rhs); |
| } |
| }; |
| |
| template<typename Cmp> |
| inline void test_operator_on_search(int iters) { |
| Cmp cmp; |
| int dummy = 0; |
| for (int i = 0; i < iters; ++i) { |
| dummy += std::search( |
| lorem_ipsum.begin(), lorem_ipsum.end(), |
| needle.begin(), needle.end(), |
| cmp |
| ) - lorem_ipsum.begin(); |
| } |
| } |
| |
| BENCHMARK(LegacyCaseInsensitiveCheck, iters) { |
| test_operator_on_search<AsciiCaseInsensitiveLegacy>(iters); |
| } |
| |
| BENCHMARK(CurrentCaseInsensitiveCheck, iters) { |
| test_operator_on_search<AsciiCaseInsensitive>(iters); |
| } |
| |
| int main(int argc, char** argv) { |
| gflags::ParseCommandLineFlags(&argc, &argv, true); |
| folly::runBenchmarks(); |
| if (FLAGS_benchmark) { |
| folly::runBenchmarks(); |
| } |
| return 0; |
| } |
| |
| /* |
| ============================================================================ |
| folly/test/AsciiCaseInsensitiveBenchmark.cpp relative time/iter iters/s |
| ============================================================================ |
| LegacyCaseInsensitiveCheck 9.04us 110.60K |
| CurrentCaseInsensitiveCheck 2.96us 337.59K |
| ============================================================================ |
| */ |