如何本地获得程序运行时空
  • 板块学术版
  • 楼主Error_Eric
  • 当前回复9
  • 已保存回复9
  • 发布时间2022/9/26 08:05
  • 上次更新2023/10/27 09:55:42
查看原帖
如何本地获得程序运行时空
217300
Error_Eric楼主2022/9/26 08:05

rt,大常数选手怕 TLE/MLE。

bdfs 了几个结果,都不是很好。顺便问一下 NOI 系列赛和洛谷是怎么测时/测空间的。

  1. 程序内测时,这玩意误差蛮大的,有的不开O2本地 950-1050ms, 洛谷1200ms+,开 O2 本地 850-950 ms,洛谷 700ms+。
#ifdef LOCAL
#include<chrono>
//#pragma GCC optimize(2)
#endif
using namespace std;
int main(){
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    std::chrono::milliseconds Clock1, Clock2;
    Clock1 = std::chrono::duration_cast< std::chrono::milliseconds >(
			std::chrono::system_clock::now().time_since_epoch()
			);
    #endif
    //Main
    #ifdef LOCAL
    Clock2 = std::chrono::duration_cast< std::chrono::milliseconds >(
                    std::chrono::system_clock::now().time_since_epoch()
                    );
    fclose(stdout);
    freopen("con","w",stdout);
    printf("%lld\n",(Clock2-Clock1).count());
    #endif
}
  1. 程序外测空间,读了 ccr 的源码用的就是这个,但是 pragama过不了编译不知道为什么。
#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <psapi.h>
#pragma comment(lib, "Psapi.lib ")
using namespace std;
int main() {
    STARTUPINFO si;
    memset(&si,0,sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_SHOW;
    PROCESS_INFORMATION pi;
    PROCESS_MEMORY_COUNTERS pmc;
    bool resok=CreateProcess(TEXT("???.exe"),NULL,NULL,NULL, FALSE, 0, NULL, NULL, &si, &pi);
    if (! resok) 
        puts(">fail!"),exit(1); 
    else 
        puts(">success!");
    GetProcessMemoryInfo(&pi,&pmc,sizeof(pmc));
    float mem = pmc.PeakPagefileUsage;
    printf(">PeakMem:<%lf>\n",mem);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    return 0;
}
2022/9/26 08:05
加载中...