首页 > 解决方案 > 这个循环有更好的设计吗?

问题描述

我一次迭代超过 1 个字节,将其从文件读取到分配的内存,然后检查它是否是新 jpg 的开始,或者它是否是文件的结尾,如果不是,则将其写入当前打开的 jpg 文件(图片)。此代码有效,但是我看到我检查它是否是新的 jpg 标头,或者它是否是文件的结尾,然后写入,然后在再次开始循环之前再次检查相同的内容。由于每个循环都会检查这两个条件两次,我认为它会使用不必要的计算能力使代码变慢。感谢您的任何建议!

do
{    
     fread(p, sizeof(BYTE), 512, file);

     if (!(p[0] == 0xff && p[1] == 0xd8 && p[2] == 0xff && (p[3] & 0xf0) == 0xe0) && (!feof(file)))
     {
          fwrite(p, sizeof(BYTE), 512, img);
     }
}
while (!(p[0] == 0xff && p[1] == 0xd8 && p[2] == 0xff && (p[3] & 0xf0) == 0xe0) && (!feof(file)));

标签: c

解决方案


好吧,正如人们在评论中所说,你不应该使用while(!feof(file))在这里解释

但要专注于其他事情。你基本上有这个:

do {
    // Read
    if(<condition>) {
        // Write
    }
} while(<condition>);

假设评估条件不包含副作用并且“//写”不能影响条件,这相当于:

do {
    // Read
    if(<condition>) {
        // Write
    } else {
        break;
    }
} while(1);

或(我最喜欢的)这个:

do {
    // Read
    if(! <condition>) break;
    // Write
} while(1);

但是作为关于性能的一般建议,您应该分析您的代码以找出性能瓶颈是否真的在您认为的位置。对我来说,重复代码似乎比性能更重要。重要到足以重写它。


推荐阅读