サイトさんに感謝
引用 https://qiita.com/tyanmahou/items/8497d6e815ebf7ea90c6
引用 ChatGPT
動的配列ライブラリ作っているので、new配列とstd::vectorと比較したくなった。
で、L回した平均を出すものを作って、さらにまとめて出力できる。
#pragma once
#include<string>
#include<iostream>
#include<chrono>
#include<functional>
#include<sstream>
#include<iomanip> // ★ 追加:setwなどに必要
//シングルベンチ
//使い方:{clPTime pt(strName);時間のかかる処理}
class clPTime
{
public:
clPTime(const std::string& strName) :
m_strName(strName), m_start(std::chrono::system_clock::now())
{}
~clPTime()
{
const auto end = std::chrono::system_clock::now();
const auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - m_start).count();
// ★ 表示フォーマット調整
std::cout << std::setw(30) << std::left << m_strName << ": "
<< std::setw(5) << std::right << elapsed << " ms" << std::endl;
}
private:
std::string m_strName;
int m_iLoop;
std::chrono::system_clock::time_point m_start;
};
//マルチアベレージベンチ
//使い方:
//int iTestNum = 10;
//strExplanation="説明";
//clPAveTime::fcOverRallData_Clear(strExplanation);
//clPAveTime pt(strName, iTestNum, [&]() { fc関数A(); });
//clPAveTime pt(strName, iTestNum, [&]() { fc関数B(); });
//clPAveTime pt(strName, iTestNum, [&]() { fc関数Z(); });
//clPAveTime::fcOverRallData_Show();
class clPAveTime {
public:
clPAveTime(const std::string& strName, int iLoop, const std::function<void()>& fcFunc)
{
m_strName = strName;
s_iLoop = iLoop;
long long total = 0;
std::cout << std::setw(30) << std::left << m_strName << ": "; // ★ 左詰めで名前整列
for (int i = 0; i < iLoop; ++i) {
auto start = std::chrono::high_resolution_clock::now();
fcFunc(); // 関数を実行
auto end = std::chrono::high_resolution_clock::now();
const auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
total += elapsed;
// ★ 1〜2回目、最後の2回だけ詳細表示、それ以外はドット
if (i < 2 || i >= iLoop - 2) {
std::cout << std::setw(3) << std::right << (i + 1) << ":"
<< std::setw(4) << elapsed << "ms, ";
}
else {
std::cout << ".";
}
}
//std::cout << std::endl;
std::ostringstream ossTmpNow;
std::ostringstream ossTmpOA;
// ★ 集計結果も整列表示
ossTmpNow
<< " 平均 " << std::setw(5) << (total / iLoop)
<< " ms" << std::endl;
ossTmpOA << std::setw(30) << std::left << m_strName
<< " 平均 " << std::setw(5) << (total / iLoop)
<< " ms" << std::endl;
s_ossOverRallData << ossTmpOA.str();
std::cout << ossTmpNow.str();
}
static void fcOverRallData_Clear(std::string strExplanation);
static void fcOverRallData_Show();
static std::ostringstream s_ossOverRallData;
static int s_iLoop;
static std::string s_strExplanation;
private:
std::string m_strName;
int m_iLoop;
};
std::ostringstream clPAveTime::s_ossOverRallData;
int clPAveTime::s_iLoop = 2;
std::string clPAveTime::s_strExplanation="";
void clPAveTime::fcOverRallData_Clear(std::string strExplanation) {
s_strExplanation = strExplanation;
s_ossOverRallData.str("");
s_ossOverRallData.clear();
}
void clPAveTime::fcOverRallData_Show() {
std::cout <<
"\n"
"=====================================================\n"
"=========== 全体集計 " << std::setw(5) << clPAveTime::s_iLoop << "回の平均時間 "
"===========\n"
"=====================================================\n";
std::cout << s_strExplanation << "\n";
std::cout << s_ossOverRallData.str();
}
Arr N*N:N=5000
mtd:Specialスワップ : 1: 97ms, 2: 98ms, ...... 9: 98ms, 10: 98ms, 平均 97 ms
mtd:stdスワップ : 1: 76ms, 2: 80ms, ...... 9: 78ms, 10: 79ms, 平均 77 ms
mtd:forスワップ : 1: 118ms, 2: 124ms, ...... 9: 111ms, 10: 110ms, 平均 113 ms
mtd:forアンロールスワップ : 1: 112ms, 2: 113ms, ...... 9: 111ms, 10: 109ms, 平均 113 ms
new:stdスワップ : 1: 139ms, 2: 138ms, ...... 9: 133ms, 10: 130ms, 平均 135 ms
new:forスワップ : 1: 156ms, 2: 154ms, ...... 9: 158ms, 10: 153ms, 平均 155 ms
vec:stdスワップ : 1: 134ms, 2: 135ms, ...... 9: 137ms, 10: 126ms, 平均 132 ms
vec:forスワップ : 1: 152ms, 2: 158ms, ...... 9: 155ms, 10: 141ms, 平均 149 ms
mtd:Specialコピー : 1: 105ms, 2: 103ms, ...... 9: 104ms, 10: 104ms, 平均 104 ms
mtd:stdコピー : 1: 87ms, 2: 86ms, ...... 9: 88ms, 10: 89ms, 平均 87 ms
mtd:forコピー : 1: 111ms, 2: 107ms, ...... 9: 110ms, 10: 108ms, 平均 109 ms
mtd:forアンロール コピー : 1: 110ms, 2: 108ms, ...... 9: 110ms, 10: 109ms, 平均 108 ms
new:stdコピー : 1: 131ms, 2: 136ms, ...... 9: 135ms, 10: 124ms, 平均 132 ms
new:forコピー : 1: 148ms, 2: 158ms, ...... 9: 148ms, 10: 148ms, 平均 150 ms
vec:stdコピー : 1: 142ms, 2: 151ms, ...... 9: 137ms, 10: 137ms, 平均 142 ms
vec:forコピー : 1: 161ms, 2: 141ms, ...... 9: 155ms, 10: 146ms, 平均 149 ms
mtd:インクリメント : 1: 43ms, 2: 42ms, ...... 9: 43ms, 10: 43ms, 平均 42 ms
mtd:ポインタ++回し : 1: 44ms, 2: 42ms, ...... 9: 42ms, 10: 43ms, 平均 42 ms
new:インクリメント : 1: 71ms, 2: 66ms, ...... 9: 67ms, 10: 51ms, 平均 58 ms
vec:インクリメント : 1: 51ms, 2: 51ms, ...... 9: 50ms, 10: 55ms, 平均 53 ms
Arr N*N:N=1000
mtd:行列掛け算 : 1: 570ms, 2: 571ms, ...... 9: 570ms, 10: 574ms, 平均 571 ms
new:行列掛け算 : 1: 330ms, 2: 324ms, ...... 9: 324ms, 10: 327ms, 平均 326 ms
vec:行列掛け算 : 1: 328ms, 2: 325ms, ...... 9: 330ms, 10: 329ms, 平均 328 ms
=====================================================
=========== 全体集計 10回の平均時間 ===========
=====================================================
シングルスレッド・N*Nの行列 N=5000 掛け算は1000 cpu:i9-12900K
mtd:Specialスワップ 平均 97 ms
mtd:stdスワップ 平均 77 ms
mtd:forスワップ 平均 113 ms
mtd:forアンロールスワップ 平均 113 ms
new:stdスワップ 平均 135 ms
new:forスワップ 平均 155 ms
vec:stdスワップ 平均 132 ms
vec:forスワップ 平均 149 ms
mtd:Specialコピー 平均 104 ms
mtd:stdコピー 平均 87 ms
mtd:forコピー 平均 109 ms
mtd:forアンロール コピー 平均 108 ms
new:stdコピー 平均 132 ms
new:forコピー 平均 150 ms
vec:stdコピー 平均 142 ms
vec:forコピー 平均 149 ms
mtd:インクリメント 平均 42 ms
mtd:ポインタ++回し 平均 42 ms
new:インクリメント 平均 58 ms
vec:インクリメント 平均 53 ms
mtd:行列掛け算 平均 571 ms
new:行列掛け算 平均 326 ms
vec:行列掛け算 平均 328 ms
Hello World!
mtd、列方向おせー。改良改良
プロファイラーなるものをつかえるようになりたい