我&[u8]在二进制缓冲区上有一个切片.我需要解析它,但是我想要使用的很多方法(例如str::find)在切片上似乎不可用.
我已经看到我可以通过使用缓冲切片和我的模式来转换它str,from_utf8_unchecked()但这似乎有点危险(而且也非常hacky).
如何在此切片中找到子序列?我实际上需要模式的索引,而不仅仅是部件的切片视图,所以我认为split不会起作用.
是否可以将函数(或其他符号)导入命名空间但不导出它?例如,我想导入std::string当前的命名空间,但我不想current::string显示.
namespace current {
using std::string;
string func();
}
Run Code Online (Sandbox Code Playgroud)
current::string 不应该是一件事.
用例只是减少打字(并且不断忘记std::string其他)并使代码更清晰,而不会使所有命名空间语法混乱代码.
我想要clock_gettime(CLOCK_REALTIME,...)花多长时间打电话."回到当天"我曾经在循环的顶部称它为一次,因为它是一个相当昂贵的电话.但是现在,我希望通过vDSO和一些时钟改进,它可能不会那么慢.
我写了一些测试代码,用于__rdtscp计时重复调用clock_gettime(rdtscp调用绕过一个调用clock_gettime并将结果添加到一起的循环,这样编译器就不会进行太多的优化).
如果我clock_gettime()快速连续呼叫,时间长度从大约45k时钟周期下降到500个周期.其中一些我认为可能是第一次调用必须加载vDSO代码(仍然没有完全对我有意义),但如何需要一些调用来获得500我根本无法解释,这种行为似乎无论我如何测试它都是恒定的:
42467
1114
1077
496
455
Run Code Online (Sandbox Code Playgroud)
但是,如果我在调用clock_gettime之间休眠(一秒或十分,无关紧要),它只会达到约4.7k周期的稳定状态:
这里睡10秒钟:
28293
1093
4729
4756
4736
Run Code Online (Sandbox Code Playgroud)
这里睡1秒钟:
61578
855
4753
4741
5645
4753
4732
Run Code Online (Sandbox Code Playgroud)
缓存行为似乎无法描述这一点(在桌面系统上没有做太多任何事情).我应该为clock_gettime的调用预算多少钱?为什么呼叫变得越来越快?为什么睡一小段时间这么重要?
tl; dr我试图理解调用clock_gettime(CLOCK_REALTIME,...)所花费的时间不理解为什么它在快速连续调用时运行得更快而不是在调用之间调用.
更新:这是proc 0上的cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 158
model name : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
stepping : 9
microcode : 0x84
cpu MHz : 2800.000
cache size : 6144 KB …Run Code Online (Sandbox Code Playgroud) 函数需要大量的堆栈空间是否会阻止它内联?例如,如果我在堆栈上有一个10k自动缓冲区,是否会使该函数不太可能被内联?
int inlineme(int args) {
char svar[10000];
return stringyfunc(args, svar);
}
Run Code Online (Sandbox Code Playgroud)
我更关心gcc,但icc和llvm也很高兴知道.
我知道这不太理想,但我很好奇.缓存上的代码很可能也很糟糕.
我正在学习Rust并试图立即编写一个简单的标记器.我想通过一个字符串来运行每个正则表达式对着字符串中的当前位置,创建一个标记,然后向前跳过并重复,直到我处理完整个字符串.我知道我可以将它们放入更大的正则表达式并循环捕获,但我需要单独处理它们以进行域解析.
但是,我在正则表达式框中看不到允许偏移,所以我可以在特定点再次开始匹配.
extern crate regex;
use regex::Regex;
fn main() {
let input = "3 + foo/4";
let ident_re = Regex::new("[a-zA-Z][a-zA-Z0-9]*").unwrap();
let number_re = Regex::new("[1-9][0-9]*").unwrap();
let ops_re = Regex::new(r"[+-*/]").unwrap();
let ws_re = Regex::new(r"[ \t\n\r]*").unwrap();
let mut i: usize = 0;
while i < input.len() {
// Here check each regex to see if a match starting at input[i]
// if so copy the match and increment i by length of match.
}
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找的那些正则表达式实际上也会在运行时变化.有时候我可能只会寻找其中的一些,而其他人(在顶级)我可能会寻找几乎所有这些.
我正在尝试编写一个将数字转换为字节字符串文字的stringify!宏,类似于宏如何将其参数转换为a &str.
更具体地说,我怎么写这个:
byte_stringify!(10) -> b"10"
我将使用它来创建大量的const结构,所以我不能真正依赖于调用方法str.
更野心勃勃的是,我实际上是在将参数转换为字节字符串之前尝试添加和附加一些文本:
make_arg!(10) -> b"x10y"
更新:
老bytes!宏在哪里去了?我想我想:
bytes!(stringify!(10))
当没有其他信息时,如何让 clangd 回退到 C++20?
这是在带有最新 LLVM 的 Arch Linux 上。这是通过 Emacs LSP 运行的,但这应该没有什么区别。
我正在为我编写的浮点打印代码编写 JMH 微基准测试。我还不太关心确切的性能,但要确保基准代码正确。
\n\n我想循环一些随机生成的数据,因此我制作了一些静态数据数组并保持循环机制(增量和掩码)尽可能简单。这是正确的方法还是我应该告诉 JMH 更多关于我缺少的一些注释的情况?
\n\n另外,是否可以为测试制作显示组而不仅仅是字典顺序?我基本上有两组测试(每组随机数据一组。
\n\n完整来源位于https://github.com/jnordwick/zerog-grisu
\n\n这是基准代码:
\n\npackage zerog.util.grisu;\n\nimport java.util.Random;\n\nimport org.openjdk.jmh.annotations.Benchmark;\nimport org.openjdk.jmh.runner.Runner;\nimport org.openjdk.jmh.runner.RunnerException;\nimport org.openjdk.jmh.runner.options.Options;\nimport org.openjdk.jmh.runner.options.OptionsBuilder;\n\n/* \n * Current JMH bench, similar on small numbers (no fast path code yet)\n * and 40% faster on completely random numbers.\n * \n * Benchmark Mode Cnt Score Error Units\n * JmhBenchmark.test_lowp_doubleto thrpt 20 11439027.798 \xc2\xb1 2677191.952 ops/s\n * JmhBenchmark.test_lowp_grisubuf thrpt 20 11540289.271 \xc2\xb1 237842.768 ops/s\n * JmhBenchmark.test_lowp_grisustr thrpt 20 5038077.637 \xc2\xb1 754272.267 ops/s\n * \n …Run Code Online (Sandbox Code Playgroud) java performance-testing microbenchmark floating-point-conversion jmh
有没有人知道是否有办法从Java返回两个值(接近)零开销?我只是在寻找两个值 - 我有几个用例来处理一个字节数组(需要返回值和下一个起始位置)来尝试返回一个带有错误代码的值来做一些丑陋的修复 - 点计算并需要整个和小数部分.
我不低于一些非常丑陋的黑客.功能很小,Hotspot很高兴地介绍它.所以现在,我只需要让Hotspot基本上忽略任何对象创建或位移.
如果我将我的返回值限制为整数,我已经尝试将它们打包成长,但即使在内联之后,Hotspot似乎也无法弄清楚所有的位移和掩码都没有真正做任何事情而且它很乐意打包并解压缩注入相同的值(显然,Hotspot的窥孔优化器需要帮助的地方).但至少我不是在创造一个对象.
我更难的情况是,当我需要返回的项目之一是引用而另一个是长引用或另一个引用时(对于int情况,我认为我可以压缩OOP并使用上面描述的位填充).
有没有人试图让Hotspot为此生成无垃圾代码?现在最糟糕的情况是我必须携带一个物体然后传递它,但我想保持它自包含.线程本地是昂贵的(哈希查找),它需要是可重入的.
rust ×3
c++ ×2
java ×2
linux ×2
performance ×2
benchmarking ×1
c ×1
clangd ×1
emacs ×1
gcc ×1
inline ×1
jmh ×1
jvm-hotspot ×1
llvm ×1
optimization ×1
regex ×1
timing ×1