- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要一个变量来指向数组索引,并且像 circle 一样在到达数组末尾时返回 0。我知道我可以使用 if 语句来判断,但我不确定使用 mod 来实现相同的功能是否会更快,谁能给我一些建议?
int p=0;
int arr[10];
void add_index(){
if(p==9) p=0;
else p++;
}
或者
int p=0;
int arr[10];
void add_index(){
p=(p+1)%10;
}
最佳答案
曾几何时,绝对是的。这些天,可能没有!
我将以 Intel Skylake 为例。 DIV 指令(产生商和余数,并用于此类操作)在 32 位被除数和除数上运行,具有 23 个周期的延迟和 6 个周期的倒数吞吐量。也就是说,根据它与其他操作的流水线方式,“成本”为 6-23 个周期。 (好吧,由于执行端口,它比那个复杂一点,但在这里和我一起工作。)正确预测的跳跃是 0.5-2 个周期,具体取决于它是否被采用,而错误预测的跳跃有 16 的惩罚-17 个周期。 (所有冰雹 Agner Fog 的时间。)
英特尔分支预测硬件真的非常好。期望它能够正确预测每九个分支将被采用可能太过分了,但在内部循环中我至少期望它能够正确预测其他 8 次。这意味着 if 语句的平均周期约为 3.5 个(不包括各种整数操作,它们添加可能 1-2 个周期)。哦,这是假设编译器特别 derpy 而不是像它应该的那样使用 CMOV。
要记住的是,整数除法是现代 CPU 可以执行的最慢的“正常”操作之一。但是,对于已知除数的模数,您可以改为使用特殊的加法/乘法/移位序列。因此,在上面的代码中,除数是编译时常量而不是从变量中获取的,您实际上可能会击败 DIV。这些序列可能很难流水线化,所以很难说它是否真的会赢。无论如何,现代编译器绝对知道这样的技巧。
底线:这很难说。如果您在内循环中大量 次执行该操作,实际上可能值得尝试这两种方式和时机。不过,您可能不会看到有意义的差异,也不会证明在其上花费优化时间是合理的。但是我经常写一些需要极高性能的代码,以前PPC默认是取模,现在x64默认是if/else。 (好吧,三元。)
关于c - 值得使用 mod 来替换循环索引的 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37676479/
如何在 Mod Security 中获取响应/请求正文的大小? 我不断收到此错误,例如: [Mon Sep 17 23:34:38 2012] [error] [client 192.168.1.1]
我要计算的值 对于给定的 N 值,F(N) = (F(N-1) * [((N-R+1)^(N-R+1))/(R^R)]) mod M, R 和 M. 这里 A^B 显示 A 的幂 B 而不是任何位操作
这个程序中的ans = (ans + mod) % mod语句需要什么? 假设 mod = 10^9+7。此函数在 O(log(n)) 复杂度的模运算下计算 a 的 b 次方: long long p
我正在尝试做简单的思考。在循环中使用 ng-include 将多个 html 页面包含到渲染页面。 $scope.modules = ["mod_nav","mod_feature"
我有一个使用moodle库的项目。由于客户端请求,我不得不将 URL 从moodle.example.com 更改为learn.example.com。 我认为这将是一个简单的更改,但唉,moodle
我正在尝试制作一个 Taskfile.yml 文件来构建 go 应用程序,但我不太明白在 go build main.go 之前需要“GOFLAGS=-mod=mod”命令。 引用:https://d
我正在尝试制作一个 Taskfile.yml 文件来构建 go 应用程序,但我不太明白在 go build main.go 之前需要“GOFLAGS=-mod=mod”命令。 引用:https://d
首先,我想说,我从谷歌尝试了很多方法,但 mod_rewrite 不起作用! 我从 httpd.conf 尝试了我在谷歌上找到的 1000000 种方式,但仍然无法正常工作。 我想从 example.
你好我试图安装 libapache2-mod-fcgid mod 但总是出错。 root@mail:~# sudo apt-get install libapache2-mod-fcgid Readi
我需要在 URL 中使用 + 字符。我将 Apache 与 PHP 结合使用。 ([A-Za-z0-9/_%-@\+]*) 不起作用。 我需要的是www.domain.com/c++/ => inde
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我正在尝试在新的 Ubuntu 14.04 上设置一个 apache2 Web 服务器。我一直按照找到的说明进行操作 here一切都很顺利,直到我到达被告知编辑 mod-security.conf 的
当我运行“go mod tidy”时它会中断,因为我的项目导入的包使用路径“github.com/coreos/bbolt”导入了另一个包,但是当它从该路径获取包时,它的 go.mod 说它的路径是“
这种脚本语言没有 % 或 Mod()。我确实有一个 Fix() 可以去掉数字的小数部分。我只需要积极的结果,所以不要太健壮。 最佳答案 威尔 // mod = a % b c = Fix(a / b)
在我的小项目中,我有一个脚本通过运行静态代码检查来确保正确的代码质量,例如,我使用 errcheck验证我是否处理了代码中的每个错误。 在 dep ,对于这种依赖有一个特殊的部分,称为 require
我使用 sudo apt install golang-go 在我的 ubuntu 中安装了 go 语言. 它已成功安装。当我运行 go version我收到 go version go1.10.4
谁能帮我解决这个问题: RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://www.$1 [R=301,L] 我想
BigIntegerValue.pow(IntegerValue) Java 上的指数是整数,但我有 Biginteger 值。 我曾尝试验证签名 GOST 3410,我得到了这个代码 pow,但它太
所以我才开始使用 Forge。我只是有一个非常简单的示例 mod 用于学习目的。当我使用 gradlew build 导出 mod 时,一切正常,它将 mod 放入 forge 的 build\lib
在玩 jmh 时,我遇到了一件我无法解释的奇怪事情。 @BenchmarkMode(Mode.SingleShotTime) @Measurement(iterations = 10, batchSi
我是一名优秀的程序员,十分优秀!