Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c++;? 我想在C++中并行处理我的GooGestEff案。 我已经阅读了谷歌测试分词的文档,但是无法在C++编码环境中实现它。 由于我是编码领域的新手,所以任何人都可以通过代码向我解释下面链接中的文档吗 _C++_Googletest - Fatal编程技术网

如何在c++;? 我想在C++中并行处理我的GooGestEff案。 我已经阅读了谷歌测试分词的文档,但是无法在C++编码环境中实现它。 由于我是编码领域的新手,所以任何人都可以通过代码向我解释下面链接中的文档吗

如何在c++;? 我想在C++中并行处理我的GooGestEff案。 我已经阅读了谷歌测试分词的文档,但是无法在C++编码环境中实现它。 由于我是编码领域的新手,所以任何人都可以通过代码向我解释下面链接中的文档吗 ,c++,googletest,C++,Googletest,Google Sharding可以在不同的机器上工作,也可以使用多个线程在同一台机器上实现?Sharding不是在代码中完成的,而是在环境中完成的。您的机器指定了两个环境变量GTEST\u-TOTAL\u-SHARD,这是您正在运行的机器总数,以及GTEST\u-SHARD\u-INDEX,这两个变量对每台机器都是唯一的。当GTEST启动时,它会选择这些测试的一个子集 如果要模拟这种情况,则需要设置这些环境变量() 我可能会在.bat文件中尝试这样的操作(在Windows上): set GTES

Google Sharding可以在不同的机器上工作,也可以使用多个线程在同一台机器上实现?

Sharding不是在代码中完成的,而是在环境中完成的。您的机器指定了两个环境变量
GTEST\u-TOTAL\u-SHARD
,这是您正在运行的机器总数,以及
GTEST\u-SHARD\u-INDEX
,这两个变量对每台机器都是唯一的。当GTEST启动时,它会选择这些测试的一个子集

如果要模拟这种情况,则需要设置这些环境变量()

我可能会在.bat文件中尝试这样的操作(在Windows上):

set GTEST_TOTAL_SHARDS=10
FOR /L %%I in (1,1,10) DO cmd.exe /c "set GTEST_SHARD_INDEX=%%I && start mytest.exe"

希望新的cmd实例有自己的环境。

在命令窗口中运行以下命令对我来说很有效(与James Poag的回答非常相似,但请注意范围从“1,1,10”到“0,1,9”,“%%”->“%”和“set”到“set/a”)的变化:


进一步的实验,在C++中也可以做到这一点。但这并不简单,我也没有找到一种便携的方法。我不能发布代码,因为它是在工作中完成的

基本上,从main创建新进程(其中n是可用的核心数),从每个碎片捕获结果,合并并输出到屏幕。 为了让每个进程运行不同的分片,控制器会将分片总数和实例号提供给子进程

通过检索和复制当前环境,并根据需要在复制中设置两个环境变量(GTEST_TOTAL_SHARDS和GTEST_SHARD_INDEX),可以完成此操作。GTEST_TOTAL_SHARD始终相同,但GTEST_SHARD_索引将是子级的实例号

合并结果是乏味但简单的字符串操作。最后,我成功地得到了一个正确的总数,将所有单独碎片的结果相加

我使用的是Windows,所以使用CreateProcessA创建新的进程,传入自定义环境

事实证明,创建新进程需要相当长的时间,但我的程序运行大约需要3分钟,因此并行运行有很大的好处——在我的12核PC上,时间减少到30秒左右


请注意,如果这一切看起来有些过分,那么有一个python程序,它实现了我在这里描述的功能,但是使用了python脚本(我想-我没有使用它)。这可能更直接。

看起来它只是将测试分成N个块,然后根据环境中指定的索引在每台机器上运行不同的块。我看不出有任何理由不能在同一台机器上使用不同的环境变量运行多个碎片,假设您的代码也可以处理这个问题。它与线程没有任何关系,但它对每个碎片运行一个进程。在同一台机器上切分没有多大意义。@JamesPoag我没这么说。如果你有很多测试,它可以节省并行运行它们的时间,而据我所知,谷歌测试不会这样做。用于测试切分,但我不确定你可以得到相同的程序实例来运行不同的环境变量。也许如果您将shard#作为程序参数,并尝试设置env,然后只执行程序N次。我在单个线程中设置GTEST_shard#u索引的实现似乎只适用于一个shard,而不适用于其他shard。可能的问题是什么,它显示了测试的全局分解。问题是什么?环境变量是全局系统变量。每个用户。当您设置它时,启动一个线程并对其进行更改,线程之间就存在读取变量的竞争。我怀疑你会得到超过一个或两个碎片使用线程。您需要在不同的环境中启动.exe。我编辑了此答案,以便可能使用cmd.exe的新实例“推送”环境。不同cmd的用户空间环境变量不同,因此必须相应地更改批处理脚本。希望它能工作
set GTEST_TOTAL_SHARDS=10
FOR /L %I in (0,1,9) DO cmd.exe /c "set /A GTEST_SHARD_INDEX=%I && start mytests.exe"