作为一名经常靠近硬件工作的电气工程师(编写C),我一直对从任何给定的计算机体系结构中提取最大性能感兴趣.我一直对竞争架构性能分析感兴趣.
我有兴趣猜测是否有必要进行轻度到中度的更改,例如分支预测实现或CPU上的高速缓存大小,这些可能在像Rust这样的并发运行时比在C等过程运行时更高效.分支预测是在分析程序代码的研究论文中得出的概括上实现的.我想知道并发抽象是否会为运行时添加一个重要的工作集,从而对现有的预测算法产生负面影响.例如,在for循环中进行预测是一回事,但是当分支的目标始终是内存的一些新部分(图形,文本等)时,它将始终是缓存未命中,并且永远不会有分支它的历史 - 因为它们都没有碰过它.
这可能是一个愚蠢的问题,因为内容虽然可能总是在RAM中,但会分支到比它使用的数量级更少(一旦它被加载到缓存中)......但仍然存在应该是存储在过程运行时的高速缓存和分支预测变量中的上下文的可观察时间边界,它将在更加并行化的环境中表现为抽象边界.
-
所以我想知道......
是否遵守了这些界限?
哪些研究论文对此进行了分析?
CPU架构是否足够通用,以至于高度并发的语言不会遇到现代CPU架构中可能存在的固有程序偏差?
public ArrayList InputBuffer
{
get { lock (this.in_buffer) { return this.in_buffer; } }
}
Run Code Online (Sandbox Code Playgroud)
是否在调用InputBuffer.Clear时锁定了this.in_buffer?
或者属性是否只是在获取对它的引用时锁定in_buffer对象; 锁定退出,然后该引用用于清除?
例如,这两个陈述之间的区别:
if ( ucNum++ >= 3 ) // ucNum incremented after comparing its value to 3, correct?
{
ucNum = 0;
}
Run Code Online (Sandbox Code Playgroud)
与
ucNum++ >= 3 ? ucNum = 0 : 1; // does incrementing it happen somewhere in the middle of the inline?
Run Code Online (Sandbox Code Playgroud)
也许它是特定于编译器的.它应该在条件表达式中出现在哪里?
基本上是这样的:
switch (string.contains(x))
{
case(x = "asdf"):
break;
case(x = "jkl"):
break;
case(x = "qwerty"):
break;
}
Run Code Online (Sandbox Code Playgroud)
编辑:对不起家伙,我理想的是让switch语句检查几个不同值的字符串,并根据它在字符串中找到的值,执行适当的代码.
我必须没有正确设置一些配置属性...
基本上当我通过srvany.exe将应用程序作为服务运行时,它会启动,但是类没有正确实例化.我已经加入了60秒的延迟以允许我附加到进程,但是当我遇到我在调试器中设置的中断时,我无法让exe打破(我想这不会被编译进来?)我所能看到的只是反汇编程序.有可能做得更多吗?
我有一些代码执行一段时间(fscanf!= EOF)循环.但是,即使fscanf执行完毕,我仍需要继续运行该代码,直到满足某些条件.我的意思是我想我可以将代码复制/粘贴到while(fscanf)循环之外,并且只使用全局变量,但这看起来很混乱.当然有人之前遇到过这样的事情并且有一个更清洁的解决方案.