相关疑难解决方法(0)

> vs. = =冒泡排序会导致显着的性能差异

我偶然发现了什么.起初我认为这可能是分支错误预测的情况,就像在这种情况下一样,但我无法解释为什么分支错误预测应该导致这种现象.

我在Java中实现了两个版本的Bubble Sort并进行了一些性能测试:

import java.util.Random;

public class BubbleSortAnnomaly {

    public static void main(String... args) {
        final int ARRAY_SIZE = Integer.parseInt(args[0]);
        final int LIMIT = Integer.parseInt(args[1]);
        final int RUNS = Integer.parseInt(args[2]);

        int[] a = new int[ARRAY_SIZE];
        int[] b = new int[ARRAY_SIZE];
        Random r = new Random();
        for (int run = 0; RUNS > run; ++run) {
            for (int i = 0; i < ARRAY_SIZE; i++) {
                a[i] = r.nextInt(LIMIT);
                b[i] = a[i];
            }

            System.out.print("Sorting with sortA: ");
            long start …
Run Code Online (Sandbox Code Playgroud)

c++ java optimization performance

72
推荐指数
3
解决办法
3596
查看次数

不等式运算符比等式运算符更快吗?

我知道这是一个微观优化,所以我问出纯粹的好奇心.

逻辑上,微处理器不需要比较相等运算符的两个操作数的所有位以确定"FALSE"结果.

注意,这与编程有关,因为它会影响程序的执行速度.

optimization performance cpu-speed

54
推荐指数
5
解决办法
2万
查看次数

装配 - CMP后的JG/JNLE/JL/JNGE

我不理解JG/JNLE/JL/JNGECMP之后的说明.

例如,如果我有:

CMP al,dl
jg label1
Run Code Online (Sandbox Code Playgroud)

al=101; dl =200.

我们问jg什么?是al>dl吗?还是al-dl>0

在下一个代码上相同的prolbem:

test al,dl
jg label1
Run Code Online (Sandbox Code Playgroud)

我不明白我们比较什么,以及我们问什么" jg".

换句话说,我不明白我们何时会跳转到label1,何时不会.

谢谢.

x86 assembly eflags

53
推荐指数
2
解决办法
12万
查看次数

剪辑数字最有效/优雅的方式?

给定一个实数(n),这个实数可以是(上)的最大值,这个实数可以是(更低)的最小值,我们怎样才能最有效地剪切n,使它保持在低位和高位之间?

当然,使用一堆if语句可以做到这一点,但那很无聊!更紧凑,优雅/有趣的解决方案呢?

我自己的快速尝试(C/C++):

float clip( float n, float lower, float upper )
{
    n = ( n > lower ) * n + !( n > lower ) * lower;
    return ( n < upper ) * n + !( n < upper ) * upper;
}
Run Code Online (Sandbox Code Playgroud)

我确信还有其他更好的方法可以做到这一点,这就是为什么我把它放在那里......!

c++ algorithm math logic

47
推荐指数
7
解决办法
6万
查看次数

x> -1 vs x> = 0,是否存在性能差异

我听过一位老师放弃了这一次,从那以后一直困扰着我.假设我们要检查整数x是否大于或等于0.有两种方法可以检查:

if (x > -1){
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

if (x >= 0){
    //do stuff
} 
Run Code Online (Sandbox Code Playgroud)

根据这个老师>会稍快一点>=.在这种情况下它是Java,但据他说,这也适用于C,c ++和其他语言.这句话有什么道理吗?

c++ java operators premature-optimization micro-optimization

36
推荐指数
5
解决办法
2123
查看次数

什么是更快(x <0)或(x == -1)?

变量x是int,带有可能的值:-1, 0, 1, 2, 3.哪个表达式会更快(在CPU滴答中):

1. (x < 0)
2. (x == -1)
Run Code Online (Sandbox Code Playgroud)

语言:C/C++,但我想所有其他语言都是一样的.

PS我个人认为答案是(x < 0).

更广泛的大师:如果x-12^30

c c++ cpu optimization performance

28
推荐指数
6
解决办法
4864
查看次数

为什么循环总是被编译成"do ... while"样式(尾部跳转)?

当试图理解汇编(启用编译器优化)时,我看到这种行为:

这样一个非常基本的循环

outside_loop;
while (condition) {
     statements;
}
Run Code Online (Sandbox Code Playgroud)

经常被编译成(伪代码)

    ; outside_loop
    jmp loop_condition    ; unconditional
loop_start:
    loop_statements
loop_condition:
    condition_check
    jmp_if_true loop_start
    ; outside_loop
Run Code Online (Sandbox Code Playgroud)

但是,如果未打开优化,则会编译为通常可理解的代码:

loop_condition:
    condition_check
    jmp_if_false loop_end
    loop_statements
    jmp loop_condition  ; unconditional
loop_end:
Run Code Online (Sandbox Code Playgroud)

根据我的理解,编译后的代码更像是这样的:

goto condition;
do {
    statements;
    condition:
}
while (condition_check);
Run Code Online (Sandbox Code Playgroud)

我看不到巨大的性能提升或代码可读性提升,为什么经常出现这种情况呢?是否有此循环样式的名称,例如"尾随条件检查"?

optimization performance assembly loops micro-optimization

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

JavaScript - === vs ==运营商的表现

几个星期前,我已经读过这个帖子<快于<=?关于比较运算符C.据说它们之间的性能没有区别<,<=因为它们被解释为相同/相似的机器命令.

同时,在我们公司的"最佳实践"中,据说我们应该总是使用"==="来比较事物而不是"==".所以,我开始怀疑这是否总是合适的,因为我习惯使用"=="和"typeof ... =="并且不想改变我的写作方式: - ]

请注意,这是在JavaScript的上下文中.

那么,我有一点研究,这里应该在JavaScript比较中使用哪个等于运算符(== vs ===)?据说:

这是因为等于运算符==确实类型强制...意味着解释器隐式尝试转换值然后进行比较.

另一方面,身份运算符===不进行类型强制,因此它在比较时不会转换值的值

我开始怀疑这是否意味着当我使用"==="运算符时,我将获得良好的性能,因为没有资源将用于转换操作数.而所有的代码变成机器命令后,这是否意味着就像存在没有区别C,当你使用<<=,这是JavaScript和其他语言一样吗?

javascript performance equality comparison-operators equality-operator

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

在某些CPU的紧密循环中出现ADC/SBB和INC/DEC问题

我在Delphi中编写一个简单的BigInteger类型.它主要由TLimb的动态数组组成,其中TLimb是32位无符号整数,32位大小字段,它还保存BigInteger的符号位.

要添加两个BigIntegers,我创建一个适当大小的新BigInteger然后,在一些簿记之后,调用以下过程,将三个指针传递给左右操作数和结果的数组的相应开始,以及左右肢的数量分别为.

普通代码:

class procedure BigInteger.PlainAdd(Left, Right, Result: PLimb; LSize, RSize: Integer); 
asm
// EAX = Left, EDX = Right, ECX = Result
        PUSH    ESI
        PUSH    EDI
        PUSH    EBX
        MOV     ESI,EAX                 // Left
        MOV     EDI,EDX                 // Right
        MOV     EBX,ECX                 // Result
        MOV     ECX,RSize               // Number of limbs at Left
        MOV     EDX,LSize               // Number of limbs at Right
        CMP     EDX,ECX
        JAE     @SkipSwap
        XCHG    ECX,EDX                 // Left and LSize should be largest
        XCHG    ESI,EDI                 // so swap
@SkipSwap:
        SUB     EDX,ECX                 // …
Run Code Online (Sandbox Code Playgroud)

delphi x86 assembly

15
推荐指数
2
解决办法
919
查看次数

比较运算符性能(>,> =,<,<=)

如果要比较两个整数,运算符是否会影响执行比较所需的时间?例如,给定:

if (x < 60)
Run Code Online (Sandbox Code Playgroud)

if (x <= 59)
Run Code Online (Sandbox Code Playgroud)

哪个会提供最佳性能,还是性能差异可以忽略不计?性能结果是否取决于语言?

我经常发现自己在代码中混合使用这些运算符.任何想法将不胜感激.

comparison performance operators

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