相关疑难解决方法(0)

在C中,为什么"signed int"比"unsigned int"更快?

在C中,为什么signed int速度比unsigned int?是的,我知道这个网站已被多次询问和回答(链接如下).但是,大多数人说没有区别.我编写了代码并意外地发现了显着的性能差异.

为什么我的代码的"未签名"版本比"签名"版本慢(即使在测试相同的数字时)?(我有一个x86-64英特尔处理器).

类似的链接

编译命令: gcc -Wall -Wextra -pedantic -O3 -Wl,-O3 -g0 -ggdb0 -s -fwhole-program -funroll-loops -pthread -pipe -ffunction-sections -fdata-sections -std=c11 -o ./test ./test.c && strip --strip-all --strip-unneeded --remove-section=.note --remove-section=.comment ./test


signed int

注意:如果我明确声明signed int所有数字,则没有区别.

int isprime(int num) {
    // Test if a signed int is prime
    int i;
    if (num % 2 == 0 || num % 3 == 0)
        return 0;
    else if (num % 5 == …
Run Code Online (Sandbox Code Playgroud)

c optimization performance unsigned signed

30
推荐指数
3
解决办法
4672
查看次数

如何在C中将unsigned int转换或转换为int?

如果问题看起来很奇怪,我道歉.我正在调试我的代码,这似乎是问题,但我不确定.

谢谢!

c int unsigned types casting

16
推荐指数
3
解决办法
10万
查看次数

为什么opencv的Mat :: rows和Mat :: cols签名而不是unsigned?

我正在使用gcc的-Wall标志编译程序.我做一个比较(具有一个unsigned int)上Mat::cols,并Mat::rows在某些时候,并获得有关比较符号和无符号整数警告.虽然抛出这个并不是什么大不了的事情,但我很好奇它背后的理由Mat是什么.

从逻辑上讲,矩阵不能比空矩阵(0行和0列)更空,那么-1行或-1列的矩阵意味着什么?

在有符号和无符号整数上的计算之间似乎没有太大的性能差异.

c++ opencv

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

在x86-64中使用32位寄存器/指令的优点

有时gcc使用32位寄存器,当我希望它使用64位寄存器时.例如以下C代码:

unsigned long long 
div(unsigned long long a, unsigned long long b){
    return a/b;
}
Run Code Online (Sandbox Code Playgroud)

使用-O2选项编译(省略一些样板文件):

div:
    movq    %rdi, %rax
    xorl    %edx, %edx
    divq    %rsi
    ret
Run Code Online (Sandbox Code Playgroud)

对于无符号除法,寄存器%rdx需要0.这可以通过xorq %rdx, %rdxxorl %edx, %edx似乎具有相同的效果来实现.

至少在我的机器上没有性能提升(即加速)进行xorlxorq.

我实际上不只是一个问题:

  1. 为什么gcc更喜欢32位版本?
  2. 为什么gcc会停止xorl并且不使用xorw
  3. 有没有xorl比这更快的机器xorq
  4. 如果可能的话,总是更喜欢32位寄存器/操作而不是64位寄存器/操作吗?

assembly gcc x86-64 micro-optimization

7
推荐指数
2
解决办法
749
查看次数

我应该在计算它们的位运算之前将我的整数截断为短路吗?

假设我有一个按位表达式f: int -> int,它只依赖于输入的两个最低字节.在一般情况下,这将是任何更快的计算(uint32)f'((uint16)x),在那里f': short -> short?或者转换涉及开销?假设f编译器过于复杂,无法自行解决这个问题.

c optimization performance x86 bit-manipulation

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

unsigned long long int

我用C语言提交了一个矩阵求幂代码来找到第n个斐波纳契,我使用long long int变量来存储第n个斐波那契的模数10000007,并且法官给出了"超出时间限制"但当我使用"unsigned long"时long int"我的代码在时间内被接受,执行时间减少了.

我无法理解为什么long long int给出了"超出时间限制"和"unsigned long long int"被接受了?(极端测试案例的答案在两种情况下都是正确的)

c c++ algorithm

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

当A是无符号vs有符号时,为什么A/<constant-int>更快?

我一直在阅读优化C++ wikibook.在更快的操作章节中,其中一条建议如下:

整数除以常数

将整数(已知为正或零)除以常量时,将整数转换为无符号.

如果s是有符号整数,则u是无符号整数,C是常数整数表达式(正或负),操作s/C比u/C慢,s%C慢于u%C.当C是2的幂时,最重要的是,但在所有情况下,在分割期间必须考虑符号.

然而,从有符号到无符号的转换是免费的,因为它只是对相同位的重新解释.因此,如果s是有符号整数,您知道它是正数或零,则可以使用以下(等效)表达式加速其除法:(无符号)s/C和(无符号)s%C.

我用gcc测试了这个语句,u / C表达式似乎始终优于s / c

下面还提供了以下示例:

#include <iostream>
#include <chrono>
#include <cstdlib>
#include <vector>
#include <numeric>

using namespace std;

int main(int argc, char *argv[])
{

    constexpr int vsize = 1e6;
    std::vector<int> x(vsize);
    std::iota(std::begin(x), std::end(x), 0); //0 is the starting number

    constexpr int a = 5;

  auto start_signed = std::chrono::system_clock::now();
  int sum_signed = 0;
    for ([[gnu::unused]] auto  i : x)
    {
        // signed is by default
        int v …
Run Code Online (Sandbox Code Playgroud)

c++ optimization

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

比较有符号整数比无符号整数更快

可能的重复:
无符号与有符号整数的性能

我读的地方,它是一点点更快的x86_64比较signed intsC/C++相比unsigned ints,如for (int i...)是“快”比for (uint i...)

真的吗?为什么这是真的?我知道差异非常小,但无论如何。

c c++ performance gcc

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