- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在构建一个 PowerPC 解释器,它运行良好。在 Power 架构中,条件寄存器 CR0(x86 上的 EFLAGS)几乎在任何指令上都会更新。它是这样设置的。 CR0的值为1,如果最后一个结果为负,如果最后一个结果为正,则为2,否则为4。
我的第一个天真的解释方法是:
if (n < 0)
cr0 = 1
else if (n > 0)
cr0 = 2;
else
cr0 = 4;
但是我知道所有这些分支都不会是最佳的,每秒运行数百万次。我已经看到一些关于 SO 的黑客攻击,但似乎没有一个是过激的。例如,我发现很多例子可以根据符号或 0 将数字转换为 -1、0 或 1。但是如何使 -1 = 1、1 = 2、0 = 4?我正在寻求 Bit Hackers 的帮助...
提前致谢
更新:首先:谢谢大家,你们太棒了。我会仔细测试你所有的代码的速度,你会第一个知道谁是赢家。
@jalf:关于你的第一个建议,我实际上并没有在每条指令上计算 CR0。我宁愿保留一个 lastResult 变量,当(如果)以下指令要求一个标志时,进行比较。三个主要动机让我回到了“每次”更新:
最佳答案
首先,如果要在(几乎)每条指令之后更新此变量,显而易见的建议是:
不要
只有在后续指令需要它的值时才更新它。在其他任何时候,都没有必要更新它。
但是无论如何,当我们更新它时,我们想要的是这种行为:
R < 0 => CR0 == 0b001
R > 0 => CR0 == 0b010
R == 0 => CR0 == 0b100
理想情况下,我们根本不需要分支。这是一种可能的方法:
1
。 (如果您真的想要速度,请调查是否可以在不从内存中获取常量的情况下完成此操作。即使您必须在上面花费一些指令,这也可能是值得的)第 2 步和第 3 步可以转换以消除“如果”部分
CR0 <<= (R >= 0);
CR0 <<= (R == 0);
这样更快吗?我不知道。与往常一样,当您关心性能时,您需要衡量、衡量、衡量。
但是,我可以看到这种方法的几个优点:
缺点是我们在所有三行之间都有一个依赖链:每一行都修改 CR0,然后在下一行中使用它。这在一定程度上限制了指令级并行性。
为了最小化这个依赖链,我们可以这样做:
CR0 <<= ((R >= 0) + (R == 0));
所以我们只需要在初始化之后修改 CR0 一次。
或者,在一行中完成所有操作:
CR0 = 1 << ((R >= 0) + (R == 0));
当然,这个主题有很多可能的变体,所以请继续尝试。
关于c++ - n 是负数、正数还是零?返回 1、2 或 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9558550/
所以我目前正在代码 war 中解决以下问题: 返回一个数组,其中第一个元素是正数的计数,第二个元素是负数的总和。如果输入数组为空或 null,则返回一个空数组。 我想出了下面的代码,它并不漂亮,但我知
我想禁用文本框中的字母,这就是我使用此表达式的原因: /^[0-9]*$/ 问题是我也想允许负数, 这个表达式不允许我使用减号。(-)..我该怎么办? 最佳答案 尝试使用以下正则表达式: /^-?[0
这是一道面试题。我们有一个正整数数组,我们必须重新排列和连接数组元素,以便生成的数字是可以使用此数组形成的最大数字。 例如: [884 88] -> 88884 [20 19 90] -> 90201
所以我有点无奈。我想我了解如何对 IEEE-754 数字进行加法,但我在减法方面遇到了很大的问题。我感觉我的想法是对的,但我想和大家确认一下。 因此我们有以下两个 IEEE-754 编号: x: 0
我想将一个正数转换成相应的数字列表——数字也应该是整数。 转换时,比如1024,应该返回[1,0,2,4] 最佳答案 在 Swift 4.1 或更高版本中 let number = 1024 let
如果 float 可以用来正确表示我将使用的参数范围,我正在尝试为我的音频应用程序弄清楚。 它需要的“最大”掩码用于频率参数,它是正的,并且允许最多两位数字作为尾数(即从 20.00 hz 到 220
我是一名优秀的程序员,十分优秀!