2013-11-20 166 views
-1

我有以下代码优化C代码

void Fun2() 
    { 
     if(X<=A) 
      X=ceil(M*1.0/A*X); 
     else 
      X=M*1.0/(M-A)*(M-X); 
    } 

我想用C99以快速的方式将其编程,考虑到以下意见。

  1. XA,是32个的变量和I声明为uint64_t,虽然作为Mstatic const uint64_t

  2. 该函数被另一个函数调用,并且A的值每调用一次n次就更改为一个新值。

  3. 需要在执行时间的优化,CPU是酷睿i3,操作系统是Windows 7

数学模型,我要实现它是

F=ceil(Max/A*X) if x<=A 

F=floor(M/(M-A)*(M-X)) if x>A 

为了清晰和无混乱我以前的帖子是 我有以下代码

void Fun2() 
{ 
    if(X0<=A) 
     X0=ceil(Max1*X0); 
    else 
     X0=Max2*(Max-X0); 
} 

我想使用C99以快速方式对其进行编程,请考虑以下注释。

  1. X0,A,最大值1,并且最大值2是32位的可变和我声明为uint64_t中,虽然最大为静态常量uint64_t中。

  2. 该函数被其他函数调用,并且每n次调用Max1,A,Max2的值被更改为随机值。

  3. 我在Windows 7,并在代码块的软件

由于工作

+1

如果您声明'X0'&co。作为'uint64_t',但他们是32位变量,你的编译器有严重的问题... –

+5

如果您使用C99,请不要标记C++ – crashmstr

+2

那么问题是什么?如何优化代码?我建议你通过为编译器指定-O3来优化它......另外,如果它是一个库函数,则在'.h'文件中添加一个内联版本,因此编译器可以选择内联它。 – hyde

回答

0

如果“快速地”是指快速执行,你的第一个变化就是声明这个功能作为内联一个,一个功能的C99。

inline void Fun2() 
{ 
    ... 
    ... 
} 

我记得GNU CC有一些有趣的宏可以帮助优化这段代码。我不认为这符合C99标准,但总是很有意思。我的意思是:你的函数有一个if语句。如果你能提前知道什么可能性都有所采取的每一个分支,你可以做这样的事情:

if (likely(X0<=A))..... 

如果这是可能的X0小于或等于比A.或者:

if (unlikely(X0<=A))..... 

如果X0小于或等于A是不太可能的。

有了这些信息,编译器会优化比较并跳转,因此最可能的分支将被执行而不会跳转,所以它在没有跳转的架构中执行速度会更快分支预测。

可能提高速度的另一件事是使用:三元运算符,因为这两个分支值分配给同一个变量,像这样:

inline void Func2() 
{ 
    X0 = (X0>=A)? Max1*X0 : Max2*(Max-X0); 
} 

BTW:为什么要用ceil()ceil()适用于双精度数字以将十进制数舍入到最近的非较大整数。如果X0Max1是整数,结果中不会有小数,所以ceil()不会有任何影响。

+1

现在'inline'只是用来允许例外的ODR,现代编译器会在他们感觉如此倾向时积极地插入任何东西;在这里没有更可能的分支(在编译时),因为他说''A'每次'n'迭代随机地改变;三元运算符与那些'if's完全等价,任何最近的编译器都会发出相同的代码; 'ceil'显然是正确的,他在这个问题中用变量的类型弄得一团糟,结果是'Max1'(也许其他一些常量)是'double'(请参阅我的答案的评论)。 –

+1

-1因为误导?:废话。条件运算符不会比“if-else”导致更快的代码。如果有的话,当不知道它如何工作的人试图使用它时,会导致代码变慢,就像在这种情况下一样。第二和第三操作数将相互平衡,这是C标准所要求的。在这个例子中,无论是否使用了?:的第2个或第3个操作数,结果总是是'double'类型的。你已经强制将'Max2 *(Max-X0)'这个表达式提升为'double',这不在原始代码中,可能使得程序变慢,速度不会变快。 – Lundin

3

如果没有考虑到特定的目标,那么优化这样的代码是完全没有意义的,也是不可能的。为此,您需要以下知识:

  • 使用哪个CPU。
  • 使用哪个操作系统(如果有的话)。
  • 深入了解上述内容,您可以了解更多信息,或者与为特定编译器端口编写优化程序的人员一样多的系统。
  • 什么样的优化是最重要的:执行速度,RAM使用率或程序大小。

只有在不知道上述情况下才能进行的唯一优化是在算法级别上。代码中没有这样的算法。

因此,任何人都无法回答您的问题,直至提供更多信息。

+0

执行时间的优化,CPU是酷睿i3,操作系统是Windows 7 –

+0

@MousaFarajallah然后请编辑你的问题,并包括这些信息。 – Lundin

0

我认为有一件事情可以改进就是不使用浮点数。你的代码主要处理整数,所以你想坚持整数算术。

唯一的浮点数是Max1。如果它总是全部的,它可以是一个整数。如果没有,您可以用两个整数替换它:Max1*X0 - >X0 * Max1_nom/Max1_denom。如果你计算一次提名者/分母,并多次使用,这可以加快速度。

0

我数学模型转换为

Ceil (M*(X-0)/(A-0)) when A<=X 
Floor (M*(X-M)/(A-M)) when A>X 

Ceil (A/B) = Floor((A + (B-1))/B) 

哪代入先给:

((M * (X - m0) + c)/(A - m0)) 

其中

c = A-1; m0 = 0, when A <= X 
c = 0; m0 = M, when A >= X 

一切都将在整数运算中执行,但是提前计算倒数会非常困难;

仍然可以使用某种形式的DDA来避免计算迭代之间的划分。

使用临时常量c,m0仅用于统一两个分支的流水线,因为下一步是追求并行性。