zoukankan      html  css  js  c++  java
  • 快速填充像素的方法


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

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

    #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 ", (double)(finish - start)*1000/CLOCKS_PER_SEC); delete p; return 0; }

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

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

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

    #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 ", (double)(finish - start)*1000/CLOCKS_PER_SEC); delete p; return 0; }

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

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

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

    #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 "::"m"(a));
    for (register long i=0; i<MAX_PIXELS; i+=4) { asm("movdqa %%xmm0, %0 "::"m"(p[i])); }
    finish = clock();
        printf ("%lf ms
    ", (double)(finish - start)*1000/CLOCKS_PER_SEC); 

    delete p;
    return 0;
    }

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

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

     

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

  • 相关阅读:
    记:vue-router报错: Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location
    使用vuepress搭建GitHub pages静态博客页面
    APPCNA 手势验证登录
    appcan 文件下载与预览
    上传文件-layui+ashx
    2020已经过去五分之四了,你确定还不来了解一下JS的rAF?
    《Python 测试开发技术栈—巴哥职场进化记》—每日站会的意义
    Netty 增加接收缓冲区大小
    我想把Jhipster介绍给你
    如何写好转正答辩PPT
  • 原文地址:https://www.cnblogs.com/silmerusse/p/3536069.html
Copyright © 2011-2022 走看看