首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C++优化双线性调整算法

用C++优化双线性调整算法
EN

Stack Overflow用户
提问于 2012-07-06 21:22:32
回答 5查看 5.2K关注 0票数 1

有没有人能在下一个双线性调整算法中找到提高速度的方法?我需要提高速度,因为这是至关重要的,保持良好的图像质量。预计将用于具有低速CPU的移动设备。该算法主要用于放大大小调整。任何其他更快的双线性算法也将不胜感激。谢谢

代码语言:javascript
复制
void resize(int* input, int* output, int sourceWidth, int sourceHeight, int targetWidth, int targetHeight) 
{    
    int a, b, c, d, x, y, index;
    float x_ratio = ((float)(sourceWidth - 1)) / targetWidth;
    float y_ratio = ((float)(sourceHeight - 1)) / targetHeight;
    float x_diff, y_diff, blue, red, green ;
    int offset = 0 ;

    for (int i = 0; i < targetHeight; i++) 
    {
        for (int j = 0; j < targetWidth; j++) 
        {
            x = (int)(x_ratio * j) ;
            y = (int)(y_ratio * i) ;
            x_diff = (x_ratio * j) - x ;
            y_diff = (y_ratio * i) - y ;
            index = (y * sourceWidth + x) ;                
            a = input[index] ;
            b = input[index + 1] ;
            c = input[index + sourceWidth] ;
            d = input[index + sourceWidth + 1] ;

            // blue element
            blue = (a&0xff)*(1-x_diff)*(1-y_diff) + (b&0xff)*(x_diff)*(1-y_diff) +
                   (c&0xff)*(y_diff)*(1-x_diff)   + (d&0xff)*(x_diff*y_diff);

            // green element
            green = ((a>>8)&0xff)*(1-x_diff)*(1-y_diff) + ((b>>8)&0xff)*(x_diff)*(1-y_diff) +
                    ((c>>8)&0xff)*(y_diff)*(1-x_diff)   + ((d>>8)&0xff)*(x_diff*y_diff);

            // red element
            red = ((a>>16)&0xff)*(1-x_diff)*(1-y_diff) + ((b>>16)&0xff)*(x_diff)*(1-y_diff) +
                  ((c>>16)&0xff)*(y_diff)*(1-x_diff)   + ((d>>16)&0xff)*(x_diff*y_diff);

            output [offset++] = 
                    0x000000ff | // alpha
                    ((((int)red)   << 24)&0xff0000) |
                    ((((int)green) << 16)&0xff00) |
                    ((((int)blue)  << 8)&0xff00);
        }
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-06 21:25:11

在我的脑海中:

  1. 停止使用浮点,除非你确定你的目标CPU有良好的performance.
  2. Make确保内存访问是缓存优化的,也就是聚集在一起。
  3. 使用尽可能快的数据类型。有时这意味着最小,有时它意味着“最本机,如果有符号/无符号整数操作,则需要最少的overhead".
  4. Investigate如果查找表而不是计算得到任何东西,则会在platform.
  5. Investigate上产生性能成本(但这些操作可能会耗尽缓存,所以要小心)。

当然,还要做大量的分析和测量。

票数 3
EN

Stack Overflow用户

发布于 2012-07-06 21:48:41

内联缓存和查找表

缓存在您的算法中您的计算。

  • Avoid重复计算(如(1-y_diff)(x_ratio * j))

检查算法的所有行,并尝试识别重复模式。将这些内容提取到局部变量。还有可能提取到函数,如果它们足够短,可以内联,以使事情更像一个查找表

很有可能,如果您能腾出一些内存,您可以为您的RGB值实现一个“存储”,并简单地根据生成它们的输入来“获取”它们。也许你不需要把它们都存储起来,但你可以尝试一下,看看是否会经常回来。或者,您可以“软化”您的颜色,从而最终得到更少的值来存储更多的查找输入。

如果您知道输入的边界,就可以计算完整的域空间,并找出缓存的意义。例如,如果你不能缓存整个RGB的值,也许你至少可以预先计算移位((b>>16)等等)。在你的情况下最有可能是确定性的)。

使用正确的数据类型来提高性能

如果可以避免doublefloat变量,请使用int。在大多数架构上,由于内存模型的原因,int的计算速度会更快。你仍然可以通过简单地转换你的单位来达到不错的精度(例如,使用1026作为int,而不是1.026作为doublefloat)。很可能这个技巧对你来说就足够了。

票数 3
EN

Stack Overflow用户

发布于 2012-07-06 21:45:25

代码语言:javascript
复制
 x = (int)(x_ratio * j) ;
 y = (int)(y_ratio * i) ;
 x_diff = (x_ratio * j) - x ;
 y_diff = (y_ratio * i) - y ;
 index = (y * sourceWidth + x) ;        

当然可以使用一些优化:您在几个周期之前还在使用x_ration * j-1,所以这里真正需要的就是x+=x_ratio

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11363023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档