/*
* 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";
}