c++ - 从 uint8_t 数组修改数据很慢?

标签 c++ c x86 arm

我目前正在尝试优化我的代码以提高运行速度。目前,更新大约 3776000 字节大约需要 +30 毫秒。如果我在我的函数中删除 outPx 更新,它会以大约 3 毫秒的速度运行,这意味着对 outPx 的更新会使函数变慢。

对于如何提高下面我的功能的速度的任何潜在反馈将不胜感激。

uint8_t* outPx = (uint8_t*)out.data;
for (int px=0; px<pxSize; px+=4)
    {
        newTopAlpha = (alpha*inPx[px+3]);

        if (0xff == newTopAlpha)
        {
            // top is opaque covers entire bottom

            // set copy over BGR colors
            outPx[px] = inPx[px];
            outPx[px+1] = inPx[px+1];
            outPx[px+2] = inPx[px+2];
            outPx[px+3] = 0xff; //Fully opaque
        }
        else if (0x00 != newTopAlpha)
        {
            // top is not completely transparent
            topAlpha = newTopAlpha/(float)0xff;
            bottomAlpha = outPx[px+3]/(float)0xff;
            newAlpha = topAlpha + bottomAlpha*(1-topAlpha);
            alphaChange = bottomAlpha*(1-topAlpha);

            outPx[px] = (uint8_t)((inPx[px]*topAlpha + outPx[px]*alphaChange)/newAlpha);
            outPx[px+1] = (uint8_t)((inPx[px+1]*topAlpha + outPx[px+1]*alphaChange)/newAlpha);
            outPx[px+2] = (uint8_t)((inPx[px+2]*topAlpha + outPx[px+2]*alphaChange)/newAlpha);
            outPx[px+3] = (uint8_t)(newAlpha*0xff);
        }
    }

最佳答案

uint8_t 是一个精确宽度 整数类型,这意味着您要求编译器为您的类型分配恰好那么多的内存。如果您的系统有对齐要求,这可能会导致代码运行速度变慢。

uint8_t 更改为 uint_fast8_t。这会告诉编译器您希望此变量尽可能为 8 位,但如果可以使代码更快,则可以使用更大的大小。

除此之外,还有很多事情可能会导致性能不佳,在这种情况下,您需要说明您使用的是什么系统和编译器。

关于c++ - 从 uint8_t 数组修改数据很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16397098/

相关文章:

c++ - 我可以在 Visual Studio 项目中恢复文件吗?

c++ - 如何为模板变量赋予随机值?

c++ - 使用 noexcept C++11 正确实现函数

无法将 char 复制到 char*(字符串)的最后地址?

c - 如何将两个windows vc静态库合并为一个

c - GCC Optimization 删除了函数 Prologue 和 Epilogue

c++ - 'static void' 作为 decl-specifier

c - 服务器套接字 errno 57 - 套接字未连接

c - 为什么 memcpy 在 32 位模式下使用 gcc -march=native 在 Ryzen 上对于大缓冲区很慢?

c++ - C/C++ 内联汇编不正确的操作数类型