我正在(终于!)为我全新的 C++ 项目设置代码覆盖率监控。由于我需要一些高级 C++20 功能(读取、协程),我将其clang 6
用作编译器。
现在,我按照本指南了解如何为您的项目进行基本代码覆盖,一切都像魔术一样工作。如果我做:
clang++ -fprofile-instr-generate -fcoverage-mapping test.cpp -o test.out
LLVM_PROFILE_FILE="coverage/test.profraw" ./test.out
llvm-profdata merge -sparse coverage/test.profraw -o coverage/test.profdata
llvm-cov show ./test.out -instr-profile=coverage/test.profdata
Run Code Online (Sandbox Code Playgroud)
我在我的终端上收到一份漂亮的彩色报告,告诉我哪些内容被覆盖,哪些未被覆盖。
到现在为止还挺好!我以为我已经接近我想要的东西了,但是当我试图将报告上传到codecov.io时,痛苦就开始了。
我尝试了几件事,包括:
https://codecov.io/bash
在我的coverage
文件夹上运行他们的脚本,希望它可能会赶上我的test.profdata
. 没有骰子,这是有道理的,因为甚至llvm-cov
需要可执行文件的路径才能运行。
使用export
功能:运行时llvm-cov export --instr-profile=coverage/test.profdata ./test.out
我得到一个漂亮的 JSON 文件(通过终端)。我尝试将输出放入一个coverage.json
文件中,该文件实际上已上传,但是 codecov 只是说解析它时出错,没有进一步的信息。
我感觉完全迷失了。在他们的网站上,一切似乎都是黑箱式的,我只是不明白如何完成任何不完全符合他们可以管理的情况的事情。
我如何才能使用 codecov 进行此操作?如果 codecov 无法处理我的报告,是否还有其他等效的在线代码覆盖率可用于使其正常工作?
我知道x.unwrap()
当x: Result<T, E>
不实现时不起作用E
:Debug
需要unwrap()
打印出Err
变体以防万一x.is_err()
,但它不能。然而,有时,尤其是在测试中,我确实需要掌握其Ok
值。我以为x.expect()
会成功,因为我是在失败时指定消息的人。然而,由于某种原因,我也不完全理解,expect()
需要E: Debug
。这意味着我总是最终采取冗长、重复的方式:
let x_ok = match x {
Ok(x_ok) => x_ok,
Err(_) => panic!("Something went horribly wrong!"),
}
Run Code Online (Sandbox Code Playgroud)
我无法想象这个问题不会有更标准化的解决方案,但我很难找到一个。get_ok_or_panic
如果Err
a 的类型Result
没有实现,如何快速实现Debug
?
好的,伙计们,希望这是一个非常简单的问题:有没有办法在Windows操作系统上使用gcc运行在linux下编译的C程序?请不要告诉我在windows下重新编译它,因为我已经尝试但看起来没有c windows编译器有128位原生类型,并且使用bignum库使我的程序比10到100倍慢.有没有办法在Windows下运行Linux二进制文件?有人告诉我一些关于cygwin的事情,但我不知道从哪里开始.(我的程序也应该是可移植的,所以我不需要在我的机器上安装程序和东西).
非常感谢你!!马特奥
我正在尝试在mingw gcc下编译ac程序.这个程序使用__uint128_t
整数.当我尝试在同一个64位机器上使用标准的ubuntu gcc编译它时,它完全有效.但是,当我尝试在mingw下为windows编译它时,它甚至根本不识别__uint128_t
关键字.这是什么意思?mingw下没有128位整数?如果没有,是否有任何编程语言的Windows具有本机(和FAST)128位整数?
我开发了一个简单的C++程序来测试OpenSSL AES/GCM调用到EVP接口的性能.它的作用是取一个1024字节的字符串,用密钥加密它,然后用相同的密钥加密结果,并一次又一次地加密.我正在使用增量4字节初始化向量.
当我在我的Macbook Pro(Intel i7)上测试它时,结果非常令人印象深刻:在一个内核上运行上述过程的1048576次迭代需要一秒钟.这是1 GB/s的加密速度.如果我们同时使用所有核心,则为8 GB/s(或多或少).
现在,我在Raspberry PI 2上移植了相同的基准测试.然而,当我运行它时,需要0.16秒来完成1024次迭代.在单核上,这或多或少为6 MB/s.
现在,我很明白,现代昂贵的i7处理器和在Raspberry上运行的小型ARM处理器之间存在着巨大的巨大差异,但仍然快170倍.因此,在假设Raspberry PI 2 真的那么糟糕之前,我想检查这些参数是否合理.
有没有人做过某种基准呢?Raspberry上6 MB/s的加密速度是否合理?或者我做错了什么?
(我通过我的Macbook USB给它供电:可能这么慢,因为它没有获得足够的功率?这听起来听起来不合理.它根本不会启动,对吧?或者可能有一个超频机制来省电吗?)
更新1:我openssl -evp speed aes-256-cbc
在我的Macbook和Raspberry上做了.
在Macbook上:
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
aes-256-cbc 534591.95k 564057.62k 566522.81k 570717.87k 574876.33k
Run Code Online (Sandbox Code Playgroud)
在覆盆子上:
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
aes-256-cbc 14288.53k 16653.74k 17165.31k 17298.43k 17337.00k
Run Code Online (Sandbox Code Playgroud)
这仍然是因素33,但英特尔处理器可以使用硬件加速AES调用.不过,据我所知,GCM模式应该比CBC快得多.我不知道为什么但看起来没有一个用于GCM的openssl基准权利,但即使假设它们的表现相同,我也错过了一个因素3.
更新2检查此页面:http://elinux.org/RPi_Performance#OpenSSL.看起来我缺少10 MB/s以上.总计:使用AES/CBC(应该是)为27 MB/s,使用AES/GCM为6 MB/s(实际上是这样).
请考虑以下示例:
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <signal.h>
#include <thread>
void sleepy() {
usleep(1.0E15);
}
int main() {
std :: thread sleepy_thread(sleepy);
// Wake it up somehow...?
sleepy_thread.join();
}
Run Code Online (Sandbox Code Playgroud)
在这里,我们有一个永远睡不着的线程.我想加入它,而不必永远等待它自发地从睡眠中醒来.有没有办法从外部告诉它"嘿,醒来!",以便我可以在合理的时间内加入它?
我绝对不是线程专家,所以如果可能的话,不要假设任何东西.
请考虑以下示例.在我的代码中的某个地方是一个名字x
.我不知道x
是类型还是对象(它可能都是).有没有办法获得类型x
,即,x
如果x
是一个类型或decltype(x)
如果x
是一个对象本身?
我尝试做一些像小事一样的事情
decltype(int)
Run Code Online (Sandbox Code Playgroud)
但这会产生错误,因为int
它不是表达式.有没有替代方法来做到这一点?
我想要像:
typedef int l;
mydecltype(l) x; // int x;
mydecltype(x) y; // int y;
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?
只是一个简单的问题:有没有办法在32位机器上运行在64位Windows环境(使用mingw64)下编译的程序?我可以使用任何DLL或任何兼容层?
请考虑以下示例:
setInterval(function()
{
console.log(new Date());
});
Run Code Online (Sandbox Code Playgroud)
如果我electron example.js
在OS X下运行它,它会在我的停靠栏中打开一个图标并开始在控制台上打印出时间.但是,如果应用程序没有聚焦,一段时间后它会开始限制.
我环顾四周,发现这是由于OS X节电策略造成的.现在,如果我需要它继续在后台工作怎么办?我的应用程序将是一个守护进程,偶尔做一些事情,我不能让我的用户茫然地盯着我的应用程序多年.
我在这里发现我可以做到
electron.powerSaveBlocker.start('prevent-app-suspension');
Run Code Online (Sandbox Code Playgroud)
这实际上解决了我的问题.然而,这是非常具有侵略性的,因为就我的理解而言,它可以防止系统完全沉睡!我不需要这么多,我只需要我的应用程序在计算机处于活动状态和在线状态时执行某些操作而不会强制它永远保持清醒状态.
让我的用户不断地将应用程序保持在前台,让他们的计算机永远失眠之间,中间是不是有什么东西?
它发生在很多人身上,它发生在我身上.我在C++中使用编译时间字符串时遇到困难.
我决定采取看似无法使用的方法:使用template <char...>
类.
这就是我提出的,它是非常常见的,没什么特别的,它也不起作用.
template <char... chars> class string
{
public:
static constexpr const char value[] = {chars...};
constexpr string()
{
}
constexpr operator decltype(value) & () const
{
return value;
}
};
template <char... chars> constexpr const char string <chars...> :: value[];
Run Code Online (Sandbox Code Playgroud)
我的想法是使一个string
实例可constexpr
构造并暴露某种constexpr转换,以便它提供其内容.
现在,如果我这样做
static constexpr const char x[] = "ciao";
template <const char * str> void print()
{
std :: cout << str << std :: endl;
}
print <x> ();
Run Code Online (Sandbox Code Playgroud)
这有效并且说 …