我们正在为高级编译语言编写一个字节码,经过一些分析和优化后,很明显当前最大的性能开销是我们用来跳转到字节码情况的switch语句.
我们调查了拉出每个case标签的地址并将其存储在字节码本身的流中,而不是我们通常打开的指令ID.如果我们这样做,我们可以跳过跳转表,并直接跳转到当前正在执行的指令的代码位置.这在GCC中非常有用,但是,MSVC似乎不支持这样的功能.
我们尝试使用内联汇编来获取标签的地址(并跳转到它们),但它可以工作,但是,使用内联汇编会导致MSVC优化器避免使用整个函数.
有没有办法让优化器仍然运行代码?遗憾的是,我们无法将内联汇编提取到另一个函数中,而不是制作标签的函数,因为即使在内联汇编中也无法为另一个函数引用标签.有什么想法或想法吗?非常感谢您的意见,谢谢!
我目前正在尝试为外部启动的进程启动调试器(而不是从visual studio中启动).我似乎无法让调试器实际启动,因为它似乎没有任何反应.在这个过程中,我添加了这段代码:
Debug.Assert(Debugger.IsAttached == false, "Should be no debugger");
if (!Debugger.IsAttached)
{
Debug.Assert(Debugger.Launch(), "Debugger not launched");
}
Debugger.Break();
Debug.Assert(Debugger.IsAttached == true, "Debugger should be attached");
Run Code Online (Sandbox Code Playgroud)
断言是为了证实我并不疯狂.首先,IsAttached属性返回false,正如我所期望的那样.然后我调用Debugger.Launch,然后返回true.根据Debugger.Launch的MSDN文档,它表示如果成功启动调试器,或者如果已连接调试器,它将仅返回true.我确认一个没有附加,所以它必须启动一个.
断点永远不会被击中,第二次验证失败(IsAttached属性返回false).我也尝试在Debugger.Launch之后暂停一下,给它一些时间,但无济于事.
有什么建议?
我可能会遗漏一些关于WPF设计的基础知识,但我想知道为什么WPF控件上的许多属性都被公开为"对象"类型?
例如,MenuItem.Icon是一个Object,MenuItem.ToolTip也是.作为一个近乎第一次使用的用户,这对我来说非常混乱(我觉得我使用的是动态编程语言,不知道将ToolTip设置为String类型是否会起作用).此外,我试图将Icon设置为'System.Drawing.Icon',并且我得到ArgumentException"Argument'图片'必须是可以用作Icon的图片." 不应该输入属性,这样它至少可以描述你应该给它的世界吗?
说实话,我的猜测,其原因是因为你无法实现你没有(不创建一个包装器)创建一个类型的接口,但是这只是一个猜测.
非常感谢您的回答和见解!
我不确定为什么,但是HwndHost上的拖放事件似乎不起作用(实际上根本没有任何事件可以工作).我能够挂钩到HwndHost的Windows消息,但是,我似乎无法找到任何有用的东西.
我试图能够将一个节点从树视图拖到托管XNA的HwndHost上.我在HwndHost上将AllowDrop设置为true,但似乎什么都不做.有谁知道如何让HwndHost成为拖放操作的目标?
谢谢!
为了加快 C# 中物理对象的处理速度,我决定将线性更新算法更改为并行算法。我相信最好的方法是使用线程池,因为它是为完成作业队列而构建的。
当我第一次实现并行算法时,我为每个物理对象排队了一个作业。请记住,单个作业完成得相当快(更新力、速度、位置、检查与任何周围对象的旧状态的碰撞以使其线程安全等)。然后,我将使用单个等待句柄等待所有作业完成,每次物理对象完成时我都会递减一个互锁的整数(在达到零时,我然后设置等待句柄)。需要等待,因为我需要执行的下一个任务涉及更新所有对象。
我注意到的第一件事是性能太疯狂了。平均而言,线程池似乎运行得更快一些,但性能出现了巨大的峰值(每次更新大约 10 毫秒,随机跳跃到 40-60 毫秒)。我尝试使用 ANTS 对此进行分析,但是我无法深入了解峰值发生的原因。
我的下一个方法是仍然使用线程池,但是我将所有对象分成组。我最初只使用 8 个组,因为我的计算机的所有核心都是这样的。表演很棒。它的性能远远优于单线程方法,并且没有尖峰(每次更新大约 6 毫秒)。
我唯一想到的是,如果一项工作先于其他工作完成,就会有一个闲置的核心。因此,我将作业数量增加到20个左右,甚至增加到500个。正如我所料,它下降到了5ms。
所以我的问题如下:
我试图在 C# 中使用 ObjectIDGenerator 在序列化期间生成唯一 ID,但是,此类在 XBox360 或 Windows Phone 7 .NET 框架中不可用(它们使用 .NET 的紧凑版本)。我使用 Object to Int64 字典实现了一个版本,并且能够得到一个完整的工作版本,但是,性能并不令人满意。我正在按数万个对象的顺序进行序列化,目前这是保存/加载性能的最大瓶颈。在 PC 上使用实际的 .NET 实现需要大约 0.3 秒来序列化大约 20,000 个对象。使用我的实现,大约需要 6 秒。
在分析中,我发现重击者是字典上的 .TryGetValue 和 .Add (这是有道理的,因为它既是索引又是添加到哈希映射)。更重要的是,调用了虚拟相等运算符而不是简单地比较引用,因此我实现了一个仅使用 ReferenceEquals 的 IEqualityComparer(这导致了速度的提高)。
有没有人深入了解 ObjectIDGenerator 的更好实现?谢谢你的帮助!
我的实现:http : //pastebin.com/H1skZwNK
[编辑] 另一个说明,分析的结果表明对象比较 / ReferenceEquals 仍然是瓶颈,命中计数为 43,000,000。我想知道是否有一种方法可以将数据与此对象一起存储而无需在哈希映射中查找...