c - 这个循环有更好的设计吗?
问题描述
我一次迭代超过 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)));
解决方案
好吧,正如人们在评论中所说,你不应该使用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);
但是作为关于性能的一般建议,您应该分析您的代码以找出性能瓶颈是否真的在您认为的位置。对我来说,重复代码似乎比性能更重要。重要到足以重写它。
推荐阅读
- c# - 无法在沙盒中立即向无卡客户收费
- javascript - 优化嵌套循环以从数组中过滤包含特定值的对象
- android - Android - ConstraintLayout 以编程方式设置百分比高度?
- java - JFrame 总是在顶部,但在另一个 jframe 之下?
- java - 如何在活动启动时延迟计时器?
- azure - 最大文件上传大小 Azure Web 应用程序防火墙 WAF
- perl - 如何使用 Perl5-IDEA 在 Apache 下调试 Perl?
- c# - 插入语法句子有问题如何解决?
- azure-data-factory - 使用查找活动在 Azure 数据工厂中动态分配导入架构“表达式”中的源列
- c# - Excel 查找和替换对话框显示默认文本