2

我有一个函数将位图字符串写入浏览器,然后将其打印在屏幕上。目前,这是通过单独为每个像素生成正确的值并为每个像素使用该write(int fd, char *Buff, int NumBytes)函数三次来实现的,例如:

for (i = 0; i < IMAGE_HEIGHT; ++i)
{
    for (j = 0; j < IMAGE_WIDTH; ++j)
    {
        blue = blue();
        green = green();            
        red = red();

        write(soc, &blue, 1);
        write(soc, &green, 1);
        write(soc, &red, 1);
    }
}

我想优化代码,并认为多次调用 write() 函数肯定会让我付出一些代价。因此,想法是将所有值存储在一个字符数组中,然后调用一次 write 函数:

write (soc, image_array, sizeof(image_array));

但是我会对巨大的数组(数千/数百万个元素)有问题吗?分配给堆会解决这个问题吗?我只是想确保我没有做任何愚蠢的事情。

4

2 回答 2

2

是的,多次写入会伤害你。

Rather than write each byte individually or allocate the entire thing, I suggest writing to a small buffer (perhaps a few KB) and writing that every time it fills up. That should give you a good performance gain for small memory cost.

于 2012-04-09T02:50:48.907 回答
1

是的,在典型情况下,使用动态分配将解决(或至少缓解)问题。在典型的系统(例如,Windows 或 Linux)上,堆栈被限制在几兆字节左右(有些变量,可以作为链接时间进行调整,至少在 Windows 上是这样)。

您在免费存储上的可用空间往往主要受可用地址空间的限制(或者,在单个大分配的情况下,连续地址空间)。最多分配几千兆字节是相当常规的。在 64 位系统上,更大的分配变得相当合理(在这种情况下,通常主要受可用 RAM 以及您愿意接受使用虚拟内存的减速程度的限制)。

于 2012-04-09T02:45:21.200 回答