这个 Github 存储库将 std::regex 添加到正则表达式引擎列表中,但被其他引擎淘汰了。
为什么 std::regex - 在 libstdc++ 中实现 - 比其他的慢得多?这是因为 C++ 标准要求还是只是特定的实现没有得到很好的优化?
同样在枪战中,即使添加了 std::regex::extended 标志,std::regex 也无法编译所有其他人都接受的几个正则表达式。他们是(?i)Twain、、、、和。\b\w+nn\b(?i)Tom|Sawyer|Huckleberry|Finn\s[a-zA-Z]{0,12}ing\s([A-Za-z]awyer|[A-Za-z]inn)\s\p{Sm}
更新:添加了与 boost::regex 的比较。
UPDATE2:添加了ctre
出于好奇,我一直在查看sort标准库中的包和slices即将添加到标准库中的实验包的源代码。这两个包都定义了一个IsSorted函数,通过验证相邻元素是否有序来检查列表是否已排序。然而,这是相反的。
我创建了一个小的复制品,松散地基于通用slices包。我的实验确实表明反向版本更快。
func IsSortedForward[T any](slice []T, compare func(a, b T) int) bool {
for i := 0; i < len(slice) - 1; i++ {
if compare(slice[i], slice[i+1]) > 0 {
return false
}
}
return true
}
func IsSortedForward2[T any](slice []T, compare func(a, b T) int) bool {
n := len(slice) - 1
for i := 0; i < n; i++ {
if compare(slice[i], slice[i+1]) > …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用一个名为CodeIgniter的PHP框架.
我感兴趣的一件事就是它的速度.但是,我没有办法知道它有多快,而且不想简单地用它的网站来表达它.有人知道我自己如何确定速度,或者有人能告诉我一个可以的网站吗?
解决方案:显然,罪魁祸首是使用floor(),其性能在glibc中依赖于操作系统.
这是前一个问题的后续问题:Linux上的程序速度比Windows快 - 为什么?
我有一个小的C++程序,当用nuwen gcc 4.6.1编译时,在Wine上比在Windows XP上运行得快得多(在同一台计算机上).问题:为什么会发生这种情况?
Wine和Windows的时间分别为~15.8和25.9秒.请注意,我在谈论相同的可执行文件,而不仅仅是相同的C++程序.
源代码在帖子的末尾.编译后的可执行文件在这里(如果你足够信任我).
这个特殊的程序没有任何用处,它只是一个最小的例子,从我有一个更大的程序.请参阅另一个问题,以获得原始程序的一些更精确的基准测试(重要!!)和最常见的可能性排除(例如其他程序在Windows上占用CPU,处理启动损失,系统调用的差异,如内存分配) .另请注意,虽然我在这里使用的rand()是简单,但在原版中我使用了自己的RNG,我知道它没有堆分配.
我在这个主题上提出一个新问题的原因是,现在我可以发布一个实际的简化代码示例来重现这个现象.
代码:
#include <cstdlib>
#include <cmath>
int irand(int top) {
return int(std::floor((std::rand() / (RAND_MAX + 1.0)) * top));
}
template<typename T>
class Vector {
T *vec;
const int sz;
public:
Vector(int n) : sz(n) {
vec = new T[sz];
}
~Vector() {
delete [] vec;
}
int size() const { return sz; }
const …Run Code Online (Sandbox Code Playgroud) 我试图通过使用Apache Bench(ab)模拟几个并发请求来对我们的上传服务器进行基准测试.我读过这个帖子,详细的必要步骤,也该#1的问题,但我仍然无法创建一个有效的基准.
这是我在Apache Bench中使用的命令
ab -n 10 -c 6 -p post_data.txt -T "multipart/form-data; boundary=1234567890" http://myuploadserver.com/upload
Run Code Online (Sandbox Code Playgroud)
这些是我的post_data.txt文件的内容.我为这个长度道歉.
--1234567890
Content-Disposition: form-data; name="upload"; filename="Octocat.png"
Content-type: image/png
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
--1234567890--
Run Code Online (Sandbox Code Playgroud)
这是.txt我正在测试的实际文件的链接.
最后,这是服务器上的错误(带有Express和bodyParser()中间件的Node.js )
POST /upload 400 1ms
Error: parser error, 12 of 25135 bytes parsed
at IncomingForm.write (/Users/bjedrocha/Development/platypus-node/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js:143:17)
at IncomingMessage.<anonymous> (/Users/bjedrocha/Development/platypus-node/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js:110:12)
at IncomingMessage.EventEmitter.emit (events.js:95:17)
at IncomingMessage.<anonymous> (_stream_readable.js:736:14)
at IncomingMessage.EventEmitter.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:408:10)
at emitReadable (_stream_readable.js:404:5)
at readableAddChunk (_stream_readable.js:165:9)
at …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种编程技术,确保用于基准测试的变量(没有可观察到的副作用)不会被编译器优化掉
/**
* Call doNotOptimizeAway(var) against variables that you use for
* benchmarking but otherwise are useless. The compiler tends to do a
* good job at eliminating unused variables, and this function fools
* it into thinking var is in fact needed.
*/
#ifdef _MSC_VER
#pragma optimize("", off)
template <class T>
void doNotOptimizeAway(T&& datum) {
datum = datum;
}
#pragma optimize("", on)
#else
template <class T>
void doNotOptimizeAway(T&& datum) {
asm volatile("" : "+r" (datum)); …Run Code Online (Sandbox Code Playgroud) Chandler Carruth在他的CppCon2015演讲中引入了两个函数,可以用来对优化器进行一些细粒度的抑制.它们可用于编写微基准测试,优化器不会简单地将其变为无意义.
void clobber() {
asm volatile("" : : : "memory");
}
void escape(void* p) {
asm volatile("" : : "g"(p) : "memory");
}
Run Code Online (Sandbox Code Playgroud)
这些使用内联汇编语句来更改优化程序的假设.
程序集语句声明clobber其中的汇编代码可以在内存中的任何位置读写.实际的汇编代码是空的,但优化器不会查看它,因为它是asm volatile.当我们告诉它代码可能在内存中的任何地方读写时,它都相信它.这有效地防止优化器在调用之前重新排序或丢弃内存写入clobber,并在调用clobber† 后强制执行内存读取.
所述一个中escape,另外使指针p可见的组装块.同样,因为优化器不会查看代码可能为空的实际内联汇编代码,并且优化器仍将假定该块使用指针指向的地址p.这有效地强制p存储器中的任何点而不是寄存器中的点,因为汇编块可能执行从该地址的读取.
(这很重要,因为clobber函数不会强制读取或写入编译器决定放入寄存器的任何内容,因为汇编语句中clobber并未声明组件中的任何内容都必须可见.)
所有这些都发生在没有任何额外代码由这些"障碍"直接生成的情况下.它们纯粹是编译时的工件.
但是,它们使用GCC和Clang支持的语言扩展.有没有办法在使用MSVC时有类似的行为?
†要理解为什么优化器必须这样思考,想象一下汇编块是否为内存中的每个字节添加1的循环.
是否存在任何性能基准?
我正在寻找创建一个repo并提交/推送遗留代码,这些代码可以运行几个演出.
是更快/足迹等?
如果这太模糊,我道歉
有没有快速/简单的方法来做到这一点(至少粗略估计)?
我是基准测试算法,我认为知道我的计算机执行指令的绝对速度并将其与我的渐近分析进行比较会很酷.
benchmarking ×10
c++ ×5
performance ×4
algorithm ×1
apachebench ×1
assembly ×1
c ×1
c++11 ×1
c++14 ×1
codeigniter ×1
dvcs ×1
git ×1
go ×1
libstdc++ ×1
linux ×1
matlab ×1
mercurial ×1
node.js ×1
optimization ×1
php ×1
re2 ×1
regex ×1
sorting ×1
visual-c++ ×1
warm-up ×1
windows ×1