1

我有一堆.cpp文件,它们一起处理类似但大小不同的数据文件。对于较大的数据文件,我想对 .cpp 文件中的函数进行一些时序研究。

我想抑制输出这些大数据集的结果,只打印计时结果。对于较小的数据集,我想打印到屏幕上以验证算法/代码的正确性。

我不想重复注释/取消注释适当的cout语句并重新编译,我想使用命令行参数(或其他一些技术)来选择性地抑制输出。

有什么建议么?我能想到的最简单的方法是使用argcand argv,但我不确定它们是否是全局变量,可以被不同文件的函数使用。

4

4 回答 4

4

当然argv并且argc不是全局变量,因为它们显然是函数范围的局部变量main()

int main(int argc, char * argv[]) { /* ... */ }

为了方便选项处理,您可能希望查看getopt.h.


抑制输出的一种方法是grep在 shell ( ) 上使用或文件重定向time ./prog > /dev/null,但这仍然会产生实际输出函数的成本。

我提出两个可能的想法:

  1. 通过调用您的关键功能clock()并自己进行测量和报告。

  2. 允许用户传递详细程度参数(在运行时使用命令行选项,或在编译时使用 a #define)并且仅根据详细程度级别进行打印。

对于想法(1),我使用以下宏:

#define CLOCK_TICK(acc, ctr)  ctr = std::clock()
#define CLOCK_TOCK(acc, ctr)  acc += (std::clock() - ctr)
#define CLOCK_RESET(acc) acc = 0
#define CLOCK_REPORT(acc) 1000. * double(acc) / double(CLOCKS_PER_SEC)

对于想法(2),我会做这样的事情:

#ifndef VERBOSE
#  define VERBOSE 0
#endif

#if VERBOSE > 0
// print level 1
#if VERBOSE > 1
// print level 2
#endif
#endif

然后,您可以使用 etc. 进行编译-DVERBOSE=3以启用特定级别的日志记录。

如果这过于手动,您应该为您的应用程序寻找合适的日志框架。

于 2011-09-20T22:20:51.197 回答
4

你的直觉是正确的——使用传递给你的函数的argc和值——但它们不是全局变量。您需要以某种方式使您的信息全局化:我建议解析一次参数,并保留一组可以轻松查询的全局标志。argvmain

例如:

// In a common header file that gets included in each source file
extern bool g_bFlag1;
extern bool g_bFlag2;
...

// In your main source file
bool g_bFlag1 = false;
bool g_bFlag2 = false;
...
int main(int argc, char **argv)
{
    // Parse command line and store results in global flags
    for (int i = 1; i < argc; i++)
    {
        if (strcmp(argv[i], "--flag1") == 0)
            g_bFlag1 = true;
        else if (strcmp(argv[i], "--flag2") == 0)
            g_bFlag2 = true;
        else
            ;  // etc.
    }
}

// In any other source file:
if (g_bFlag1)
{
    // do stuff if and only if g_bFlag1 is set
}

--flag1然后你可以在命令行上传递。对于更复杂的参数解析,我建议使用诸如GNU getopt之类的库。

于 2011-09-20T22:23:09.197 回答
2

默认情况下,您必须使用的所有输出都是 stdout (as cout) 和 stderr (as cerr)。

所以一些选项是:

  • 将您的时间写入标准错误,而不是标准输出,并将它们通过管道传输到命令行的不同位置
  • 为您的计时数据打开一个日志文件,然后写入该日志文件
  • 用“[timing]”之类的标记输出的每一行,然后grep在命令行上使用以仅显示您想要查看的输出行。
于 2011-09-20T22:21:32.063 回答
0

通常我使用预处理器指令来做到这一点:

/*inside file_name.cpp*/

//uncomment next line to activate debug print on this file
//#define FILE_NAME_DEBUG  
#ifdef FILE_NAME_DEBUG
cout << "activate debug print\n";
#endif

这种方法可以选择性地抑制打印语句,但每次都需要重新编译模块。

于 2011-09-20T22:21:28.117 回答