首页 > 其他 > 详细

快速填充像素的方法

时间:2014-01-29 14:58:15      阅读:493      评论:0      收藏:0      [点我收藏+]


假定我们要用同一种颜色填充100M个像素,每个像素占4个字节,什么方法最快?

第一种方法,也是最简单的方法,就是用一个循环不断填充每一个像素。

bubuko.com,布布扣
#include <time.h>
#include <stdio.h>

#define MAX_PIXELS 0x6400000
#define COLOR 0xaabbccdd

int main () {
    int *p = new int[MAX_PIXELS];
    clock_t start, finish;

    start = clock();
for (long i=0; i<MAX_PIXELS; i++) { p[i] = COLOR; }
finish
= clock(); printf ("%lf ms\n", (double)(finish - start)*1000/CLOCKS_PER_SEC); delete p; return 0; }
bubuko.com,布布扣

测试下性能,在gcc编译器不优化的情况下,需要270ms。

如果加上优化选项 -O3,需要210ms。是快了一点,但是很有限。

 

第二种方法,使用std::fill()函数。

bubuko.com,布布扣
#include <time.h>
#include <stdio.h>
#include <algorithm>
#define MAX_PIXELS 0x6400000 #define COLOR 0xaabbccdd int main () { int *p = new int[MAX_PIXELS]; clock_t start, finish; start = clock(); std::fill (p, p + MAX_PIXELS, COLOR); finish = clock(); printf ("%lf ms\n", (double)(finish - start)*1000/CLOCKS_PER_SEC); delete p; return 0; }
bubuko.com,布布扣

在gcc编译器不优化的情况下,仍然需要270ms。

如果加上优化选项 -O3,居然能在80ms跑完。这是什么巫术?

 

第三种方法,利用SSE指令嵌入汇编。 通过一条指令可以一次完成4个像素128位的填充,应该可以比一次1个像素大致快4倍。

bubuko.com,布布扣
#include <time.h>
#include <stdio.h>

#define MAX_PIXELS 0x6400000
#define COLOR 0xaabbccdd

int main () {
    int *p = new int[MAX_PIXELS];
    clock_t start, finish;
    
int
a[4] = {COLOR, COLOR, COLOR, COLOR};
start
= clock(); asm("movdqa %0, %%xmm0\n"::"m"(a));
for (register long i=0; i<MAX_PIXELS; i+=4) { asm("movdqa %%xmm0, %0\n"::"m"(p[i])); }
finish = clock();
    printf ("%lf ms\n", (double)(finish - start)*1000/CLOCKS_PER_SEC); 

delete p;
return 0;
}
bubuko.com,布布扣

测试下性能,在gcc编译器不优化的情况下,只需要70ms。

加上优化选项 -O3,反倒稍慢点需要80ms。原因是过度优化添加了一些冗余指令。

 

原来std::fill()的巫术就是利用了SSE优化。

快速填充像素的方法

原文:http://www.cnblogs.com/silmerusse/p/3536069.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!