/* * Copyright (C) 2024 Splash authors * * This file is part of Splash. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Splash is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Splash. If not, see . */ #include #include #include #include #include #include #include #include #include #include "./utils/osutils.h" const sh4lt::ShType shtype{/*media=*/"nomedia", /*label=*/"perf_sh4lt", /*group=*/"test"}; const size_t shmsize = 1 << 26; const size_t loopCount = 1 << 8; auto shmlogger = std::make_shared(); std::atomic_int bufferCount{0}; std::mutex copyMutex{}; std::condition_variable copyCondition{}; std::vector srcData((size_t)shmsize); std::vector sinkData((size_t)shmsize); void onData(void* data, size_t size) { std::unique_lock lock(copyMutex); std::copy(static_cast(data), static_cast(data) + size, sinkData.data()); std::cout << bufferCount << " received\n"; bufferCount++; copyCondition.notify_all(); } int main() { sh4lt::Writer writer(shtype, shmsize, shmlogger); sh4lt::Follower follower( shtype.path(), [&](void* data, size_t size, const sh4lt::Time::info_t*) { onData(data, size); }, nullptr, nullptr, shmlogger); std::cout << "Preparing buffer data...\n"; for (size_t i = 0; i < shmsize; ++i) srcData[i] = static_cast(i % 256); const auto start = std::chrono::steady_clock::now(); for (size_t loopId = 0; loopId < loopCount; ++loopId) { std::unique_lock lock(copyMutex); writer.copy_to_shm(srcData.data(), srcData.size(), -1, -1); std::cout << "Buffer " << loopId << " sent... "; while (true) { copyCondition.wait(lock); if (static_cast(bufferCount) > loopId) break; } } const auto end = std::chrono::steady_clock::now(); const auto duration = std::chrono::duration_cast(end - start).count(); std::cout << "Sent " << loopCount << " buffers of size " << static_cast(shmsize) / static_cast(1 << 20) << " MB through sh4lt, in " << duration << " us\n"; std::cout << "Bandwidth : " << (static_cast(loopCount * shmsize) / static_cast(1 << 20)) / (static_cast(duration) / 1000000.0) << " MB/sec\n"; }