我试图准确理解谷歌的DoNotOptimize()运作方式。
为了完整起见,以下是它的定义(对于 clang 和非常量数据):
template <class Tp>
inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp& value) {
asm volatile("" : "+r,m"(value) : : "memory");
}
Run Code Online (Sandbox Code Playgroud)
据我了解,我们可以在如下代码中使用它:
start_time = time();
bench_output = run_bench(bench_inputs);
result = time() - start_time;
Run Code Online (Sandbox Code Playgroud)
为了确保基准保持在关键部分:
start_time = time();
DoNotOptimize(bench_inputs);
bench_output = run_bench(bench_inputs);
DoNotOptimise(bench_output);
result = time() - start_time;
Run Code Online (Sandbox Code Playgroud)
具体来说,我不明白的是为什么这保证(是吗?)run_bench()不会移到上面start_time = time()。
(有人在这个评论中问过这个问题,但我不明白答案)。
据我了解,上面DoNotOptimze()做了几件事:
value进入堆栈,因为它是通过 C++ 引用传递的。您不能有指向寄存器的指针,因此它必须位于内存中。value现在位于堆栈上,因此随后破坏内存(如在 asm 约束中完成的那样)将迫使编译器假设value通过调用DoNotOptimize(value).+r,m …benchmarking inline-assembly compiler-optimization google-benchmark instruction-reordering
另一个Python代码样式问题.
如果我有一些"常量值"(引用因为Python中没有这样的东西)适用于单个类,那么首选:模块级变量还是类变量?
例如假设我们有一个类Counter在达到恒定阈值时做某事,这是首选的?
class Counter(object):
THRESHOLD = 6
...
def increment(self):
self.val += 1
if self.val == Counter.THRESHOLD:
do_something()
Run Code Online (Sandbox Code Playgroud)
要么:
COUNTER_THRESHOLD = 6
class Counter(object):
...
def increment(self):
self.val += 1
if self.val == COUNTER_THRESHOLD:
do_something()
Run Code Online (Sandbox Code Playgroud)
我设法挖掘出来的唯一一件事就是来自Python文档.他们建议将类变量理想地视为"常量":
类变量可以用作实例变量的默认值,但使用可变值可能会导致意外结果.
https://docs.python.org/2/reference/compound_stmts.html#class-definitions
但是,这并没有真正回答这个问题.编辑:正如@JBernardo指出的那样,这是无关紧要的,因为它指的是可变数据类型,而不是可变变量值.
思考?
谢谢
我最近不得不看git rebase --rebase-merges,但我运气不佳。
我维护了 Rust 编译器的一个分支,我最近刚刚在上游合并,在此过程中修复了大量合并冲突。然后我不得不进行第二次合并,因为我很不走运,并且在我进行第一次合并时上游存储库被破坏了。
我希望用来git rebase -i --rebase-merges将我的两个合并压缩在一起,但保留上游创建的嵌套合并(如果可能的话)。
问题是,无论我尝试什么,都会收到此错误消息:
$ git rebase --rebase-merges -i sd-upstream/master
error: refusing to update ref with bad name 'refs/rewritten/Auto-merge-of-#65134---davidtwco:issue-19834-improper-ctypes-in-extern-C-fn,-r=rkruppe'
hint: Could not execute the todo command
hint:
hint: label Auto-merge-of-#65134---davidtwco:issue-19834-improper-ctypes-in-extern-C-fn,-r=rkruppe
hint:
hint: It has been rescheduled; To edit the command before continuing, please
hint: edit the todo list first:
hint:
hint: git rebase --edit-todo
hint: git rebase --continue
Run Code Online (Sandbox Code Playgroud)
(上面sd-upstream是我的组织的上游,而不是 Rust 的——我在合并之前在我的分支之前对树进行了重新定位)
即使我没有对 todo 做任何更改,我也会收到上述错误。
我做错了什么,还是 git …
我想知道是否有办法知道 webkitdownload 何时完成且没有错误。我正在使用 C API。我希望会发出信号(类似于下载开始时),但情况似乎并非如此。
搜索 webkit API 索引,我看不到可能相关的信号:http ://webkitgtk.org/reference/index-all.html
我真的必须轮询每个 webkit 下载直到它完成吗?
干杯
假设我们有一个映射K - > V,其中域K是一个集合([1,2,3]),共域V从集合中得出(['a','b' ,'C']).是否有一种简洁的方法可以枚举为可迭代(理想情况下是字典的列表或生成器),所有可能的映射:
例如.
[ { 1 : 'a', 2 : 'a', 3 : 'a' },
{ 1 : 'a', 2 : 'a', 3 : 'b' },
{ 1 : 'a', 2 : 'b', 3 : 'a' },
...
{ 1 : 'c', 2 : 'c', 3 : 'c' }
]
Run Code Online (Sandbox Code Playgroud)
请注意,域的大小不固定,因此这种解决方案并不理想:
[ { 1 : x, 2 : y, 3 : z } for x in V for y in V for z in V ]
Run Code Online (Sandbox Code Playgroud)
干杯
我想知道是否有办法在C中找到称为当前函数(在运行时)的函数.
我知道你可以__FUNCTION__在gcc中使用,但有没有办法不使用C预处理器?
可能不是.
干杯
假设我们有一个i8要转换为i16 无符号扩展的类型。
我们不能进行简单的as强制转换,因为这将导致扩展。
println!("{:b}", -128i8); // 10000000 <- we want this zero-extended in an i16.
println!("{:b}", -128i8 as i16); // 1111111110000000 sign extended :(
Run Code Online (Sandbox Code Playgroud)
我们无法转换,因为类型的大小不同:
println!("{:b}", unsafe {mem::transmute::<_, i16>(128i8)});
// ^ error[E0512]: cannot transmute between types of different sizes, or dependently-sized types :(
Run Code Online (Sandbox Code Playgroud)
我想出的最好的方法是以下复杂的铸造链:
println!("{:b}", -128i8 as u8 as u16 as i16); // 10000000 :), but :( because convoluted.
Run Code Online (Sandbox Code Playgroud)
中间转换 tou8意味着转换到 au16将零扩展而不是符号扩展,然后从u16to转换i16就可以了,因为类型大小相同并且不需要扩展。
但一定有更好的办法吗?有没有?
c ×2
python ×2
benchmarking ×1
casting ×1
coding-style ×1
gcc ×1
git ×1
git-merge ×1
git-rebase ×1
map ×1
rust ×1
set ×1
stack ×1
webkit ×1