我是嵌入式系统的新手。我正尽力学习和提高。我陷入了困境,可能只是忽略并继续前进。但是,我忍不住让它发痒。我觉得我必须明白这一点。
在我的路上,我能找到的最好的资源之一是Quantum Leaps,LLC的YouTube播放列表:Embedded Systems Programming Course
在6.12之后的Lesson 2中,Samek先生解释了一些关于管道失速的问题。乍一看,我听不懂它的一句话。然后我做了一些关于管道,气泡,树枝等的研究和阅读,以熟悉概念并理解它们背后的基本机制。然后我再次观看了视频,但我仍然不明白第二种情况如何更快。
编辑以使问题尽可能自包含:
在视频中,代码编写如下:
...
++counter; // Let's call this line "Line X"
while (counter < 20) {
// Assembly instructions to go back to Line X
}
...
编译代码获得此结构后:
var items = XDocument.Parse(xml)
.Descendants("item")
.Select(i => new
{
Title = (string)i.Element("title"),
Description = (string)i.Element("description"),
Link = (string)i.Element("link"),
Encoded = (string)i.Element("{http://purl.org/dc/elements/1.0/modules/content/}encoded"), //<-- ***
})
.ToList();
如果我没有弄错的话,Samek先生说第二个代码更快,因为它避免了分支。但我不明白怎么做。
提前感谢任何帮助(以及学习和改进的建议)!
答案 0 :(得分:1)
用C编写的代码有两个分支:
while
循环条件时的条件分支生成的程序集重新排序代码,以便消除无条件分支,并且只需要条件分支。
这种分支指令的消除导致视频作者提到的加速。请参阅视频中显示的流图像,以查看两者之间的差异。
关于管道停滞和分支预测的部分与此无关,而是讨论另一件需要注意的事情:每个条件分支都可能导致流水线停滞,因此限制条件分支的数量可能是有利的。 / p>