- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我的术语缺乏,我事先表示歉意。我编写了一段代码来演示一系列 if 语句与 else/if 语句的低效率。结果对我来说没有任何意义。
这是一个简单的算法,它遍历一个数组(100000000 个元素)并计算元素的出现次数,即 1、2、3、4、5 或其他。
clock_t time1;
time1 = clock();
for (int i=1; i<=n; i++)
{
if (arr[i]==1)
p1++;
if (arr[i]==2)
p2++;
if (arr[i]==3)
p3++;
if (arr[i]==4)
p4++;
if (arr[i]==5)
p5++;
if (!(arr[i]>=1 && arr[i]<=5))
j++;
}
time1 = clock() - time1;
printf("count of 1s:\t %d\n",p1);
printf("count of 2s:\t %d\n",p2);
printf("count of 3s:\t %d\n",p3);
printf("count of 4s:\t %d\n",p4);
printf("count of 5s:\t %d\n",p5);
printf("count of errors:\t %d\n",j);
printf("\n --- counting took: %.10f ms---\n",((double)(time1)/CLOCKS_PER_SEC)*1000);
然后相同,但使用 else if
clock_t time2;
time2 = clock();
for (int i=1; i<=n; i++)
{
if (arr[i]==1)
p1++;
else if (arr[i]==2)
p2++;
else if (arr[i]==3)
p3++;
else if (arr[i]==4)
p4++;
else if (arr[i]==5)
p5++;
else j++;
}
time2 = clock() - time2;
正如预期的那样,当给定一个从 1 到 5 的随机值数组时,else if 的速度大约是原来的两倍但是(这里出现了困惑)当它给出了一千个 1 的数组时,我希望 if 系列花费相同的时间,因为它必须检查每个条件,即使第一个条件已经为真 - 但它需要一半的时间当我给它的数组只有 5 秒时,它也更快。
谁能解释一下如何才能更快? - 谢谢:/(当我给它运行从 4 到 5 的值时,它实际上花费的时间与从 1 到 5 的值大约相同)
(here are the results of the whole thing [ignore the Czech please])
编辑
以下是图像中的时间:
Code 1 - random input: 2451 ms
Code 2 - random input: 2401 ms
Code 1 - all-one input: 932 ms
Code 2 - all-one input: 573 ms
Code 1 - all-five input: 923 ms
Code 2 - all-five input: 697 ms
最佳答案
现代 CPU 是非常复杂的野兽。
我猜你更多的是对 CPU 分支预测器进行基准测试,而不是其他任何东西:如果你用 1...5 范围内的随机数填充数组,那么当任何 if
被执行。
如果用常量填充数组,预测变量将 100% 正确。
即对于随机输入,评估的 if
的数量确实很重要,因为大量的 if 会导致 CPU 管道停顿。
在恒定输入的情况下,执行的 if 数量或多或少可以忽略不计,并且不会出现管道停顿。重要的是一些 CPU 内部结构以及编译器优化代码的能力。智能编译器也许能够有效地将两个或两个示例之一替换为 switch
语句,因此无需查看生成的指令,我们就可以推测。
关于C -一系列 if 语句与 else if 时间测量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50016445/
创建一个“海盗对话”,可以选择左手或右手。我希望它对“左”和“右”的不同拼写做出积极的回答(正如您将在代码中看到的那样),但是,当我为所有非“右”或“左”的输入添加最终的“else”代码时,它给了我一
With 语句 对一个对象执行一系列的语句。 With object statements End With 参数 object 必需的部分
While...Wend 语句 当指定的条件为 True 时,执行一系列的语句。 While condition  ; Version [stat
所以我正在处理的代码有一个小问题。 while True: r = input("Line: ") n = r.split() if r == " ":
我有一个对象数组: var contacts = [ { "firstName": "Akira", "lastName": "Laine", "number"
int main() { int f=fun(); ... } int fun() { return 1; return 2; } 在上面的程序中,当从main函数中调用一个
我的项目中有很多 if 语句、嵌套 if 语句和 if-else 语句,我正在考虑将它们更改为 switch 语句。其中一些将具有嵌套的 switch 语句。我知道就编译而言,switch 语句通常更
Rem 语句 包含程序中的解释性注释。 Rem comment 或 ' comment comment 参数是需要包含的注释文本。在 Rem 关键字和 comment 之间应有一个空格。
ReDim 语句 在过程级中声明动态数组变量并分配或重新分配存储空间。 ReDim [Preserve] varname(subscripts) [, varname(subscripts)]
Randomize 语句 初始化随机数生成器。 Randomize [number] number 参数可以是任何有效的数值表达式。 说明 Randomize 使用 number 参数初始
Public 语句 定义公有变量并分配存储空间。在 Class 块中定义私有变量。 Public varname[([subscripts])][, varname[([subscripts])
Sub 语句 声明 Sub 过程的名称、参数以及构成其主体的代码。 [Public [Default]| Private] Sub name [( arglist )]
Set 语句 将对象引用赋给一个variable或property,或者将对象引用与事件关联。 Set objectvar = {objectexpression | New classname
我有这个代码块,有时第一个 if 语句先运行,有时第二个 if 语句先运行。我不确定为什么会这样,因为我认为 javascript 是同步的。 for (let i = 0; i < dataObje
这是一个 javascript 代码,我想把它写成这样:如果此人回答是,则回复“那很酷”,如果此人回答否,则回复“我会让你开心”,如果此人回答的问题包含"is"或“否”,请说“仅键入”是或否,没有任何
这是我的任务,我尝试仅使用简短的 if 语句来完成此任务,我得到的唯一错误是使用“(0.5<=ratio<2 )”,除此之外,构造正确吗? Scanner scn = new Scanner(
有没有办法在 select 语句中使用 if 语句? 我不能在这个中使用 Case 语句。实际上我正在使用 iReport 并且我有一个参数。我想要做的是,如果用户没有输入某个参数,它将选择所有实例。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: If vs. Switch Speed 我将以 C++ 为例,但我要问的问题不是针对特定语言的。我的意思是一
Property Set 语句 在 Class 块中,声明名称、参数和代码,这些构成了将引用设置到对象的 Property 过程的主体。 [Public | Private] Pro
Property Let 语句 在 Class 块中,声明名称、参数和代码等,它们构成了赋值(设置)的 Property 过程的主体。 [Public | Private] Prop
我是一名优秀的程序员,十分优秀!