小编Edd*_*ett的帖子

Google 的“DoNotOptimize()”函数如何强制语句排序

我试图准确理解谷歌的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

5
推荐指数
1
解决办法
1312
查看次数

Python中的每类常量

另一个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指出的那样,这是无关紧要的,因为它指的是可变数据类型,而不是可变变量值.

思考?

谢谢

python coding-style

4
推荐指数
2
解决办法
5603
查看次数

使用`git rebase --rebase-merges`时“拒绝更新带有错误名称的引用”

我最近不得不看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 …

git git-merge git-rebase

4
推荐指数
1
解决办法
1196
查看次数

Webkit GTK :: 如何检测下载何时完成?

我想知道是否有办法知道 webkitdownload 何时完成且没有错误。我正在使用 C API。我希望会发出信号(类似于下载开始时),但情况似乎并非如此。

搜索 webkit API 索引,我看不到可能相关的信号:http ://webkitgtk.org/reference/index-all.html

我真的必须轮询每个 webkit 下载直到它完成吗?

干杯

c webkit

3
推荐指数
1
解决办法
4080
查看次数

在Python中生成所有可能映射的列表

假设我们有一个映射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)

干杯

python map set

3
推荐指数
1
解决办法
150
查看次数

在C中获取调用函数的名称(不使用预处理器)

我想知道是否有办法在C中找到称为当前函数(在运行时)的函数.

我知道你可以__FUNCTION__在gcc中使用,但有没有办法不使用C预处理器?

可能不是.

干杯

c stack gcc

1
推荐指数
2
解决办法
5476
查看次数

Rust:如何从有符号整数类型转换为更大的有符号整数类型*不*符号扩展

假设我们有一个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就可以了,因为类型大小相同并且不需要扩展。

但一定有更好的办法吗?有没有?

casting rust

1
推荐指数
1
解决办法
3205
查看次数