/* * Copyright (C) 2021 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 std::string shmpath = "/tmp/perf_shmdata_socket"; const size_t shmsize = 1 << 26; const size_t loopCount = 1 << 8; const std::string caps = "raw/nocaps"; Splash::Utils::ShmdataLogger shmlogger; 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() { shmdata::Writer writer(shmpath, shmsize, caps, &shmlogger); shmdata::Follower follower( shmpath, [&](void* data, size_t size) { onData(data, size); }, [&](const std::string& caps) {}, [&]() {}, &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()); 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 shmdata, in " << duration << " us\n"; std::cout << "Bandwidth : " << (static_cast(loopCount * shmsize) / static_cast(1 << 20)) / (static_cast(duration) / 1000000.0) << " MB/sec\n"; }