// Licensed to the LF AI & Data foundation under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you 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 "common/FastMem.h" #include #include #include #include #include #include #include namespace milvus::fastmem { namespace { constexpr size_t kBufferSize = 4096; std::vector MakeBenchmarkSource() { std::vector source(kBufferSize); for (size_t i = 0; i < source.size(); ++i) { source[i] = static_cast((i * 131 + 17) & 0xFF); } return source; } void StdMemcpyBenchmark(benchmark::State& state) { auto source = MakeBenchmarkSource(); std::vector destination(kBufferSize); auto size = static_cast(state.range(0)); for (auto _ : state) { std::memcpy(destination.data(), source.data(), size); benchmark::DoNotOptimize(destination.data()); benchmark::DoNotOptimize(source.data()); benchmark::ClobberMemory(); } state.SetBytesProcessed(state.iterations() * static_cast(size)); } void FastMemcpyBenchmark(benchmark::State& state) { auto source = MakeBenchmarkSource(); std::vector destination(kBufferSize); auto size = static_cast(state.range(0)); for (auto _ : state) { FastMemcpy(destination.data(), source.data(), size); benchmark::DoNotOptimize(destination.data()); benchmark::DoNotOptimize(source.data()); benchmark::ClobberMemory(); } state.SetBytesProcessed(state.iterations() * static_cast(size)); } void ApplyFastMemArgs(benchmark::internal::Benchmark* benchmark) { for (auto size : std::array{1, 2, 4, 8, 16, 32, 64, 128, 256}) { benchmark->Arg(size); } } } // namespace } // namespace milvus::fastmem BENCHMARK(milvus::fastmem::StdMemcpyBenchmark) ->Apply(milvus::fastmem::ApplyFastMemArgs); BENCHMARK(milvus::fastmem::FastMemcpyBenchmark) ->Apply(milvus::fastmem::ApplyFastMemArgs); BENCHMARK_MAIN();