- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
免责声明:下面的措辞中可能存在一些误解,如果我误解了我的代码在 C# 中处理的方式,从我写到它看起来像零和一的那一刻,请纠正我
问题如下(已链接):
在 C# 中,我的数据结构和/或我的数据操作实现是否会对性能产生影响,无论我是否使用优化技术?
编译器在输出IL的时候做了什么,可靠吗?含义:如果我让我的数据 SOA 会是 IL 中的 SOA 吗?总是?
当 JIT 读取 IL 时,我的数据结构会发生什么变化?它改变了吗?它会自动优化以适合我的处理器吗?
我知道这个演讲是针对原生代码的,并讨论处理器布局的细节与原生代码中的数据布局。
我也知道 C# 编译器和 JIT 编译器会针对这些问题为我优化。
基本上我想知道这些优化是否会对我的性能产生影响:
我从事游戏开发工作,性能至关重要,我们处理大量数据,我们需要每秒至少执行 24 次,我不能让 GC 做 300 毫秒的事情,也不能让内存在整个过程中被访问/分配当我试图检测 3000 个不同对象之间的碰撞时的位置
关于我阅读但没有真正回答问题的内容的引用:
Excellent Eric Lippert article about structs and values types in C# (如果你认为值类型总是在 C# 的堆栈中,请阅读它)
Excellent video about PerfView to track your GC behaviour and it's impact on your perfs
That SO question about Best practices to optimize memory in C# (更重要的是答案)
但是这些并没有回答与处理器和数据布局实现相关的性能成本。
在汉斯回答之后更进一步:
当你说:“你可以追求 SOA,但这无济于事。是的,你的程序会因为所有结构复制而变慢,并且以一种确定性的方式这样做。但这并不能阻止雨。你得到最坏的结果,一个缓慢的程序和完全相同的停顿。”
这并不意味着我的程序不会从 SOA 中受益,它会更快(可能),因为它有助于处理我的数据。只是它不会对 GC 本身产生影响。
另一件事是,如果我不对我的数据布局进行 SOA 或其他改进,编译器不会为我改进,对吧?我不能依赖编译器来处理那种事情?
最佳答案
担心GC就像担心今天会不会下雨一样。迟早要下雨,你无法阻止它。这是必需的,如果不这样做,你就无法保持草坪看起来很绿。你永远不想做的是故意阻止它下雨。因为如果你这样做,它会像洪水一样倾泻而下,把那漂亮的草坪洒掉。你想要的是稳定的毛毛雨。最好是在你不看的晚上。
.NET GC 强烈支持这一点。只有小的 gen #0 和 #1 集合会暂停你的程序。当您的代码继续执行时,昂贵的 gen#2 集合在后台发生。最坏情况下的暂停徘徊在接近一百微秒的地方。这与您的程序将在现代操作系统上暂停的其他原因非常难以区分。就像您的游戏循环因需要运行另一个更高优先级的内核线程而暂时暂停一样。只是毛毛雨,肉眼无法观察到。
您可以追求 SOA,但这无济于事。是的,你的程序会因为所有的结构复制而变慢,并且以一种确定性的方式这样做。但这并不能阻止雨。你得到了两者中最糟糕的,一个缓慢的程序和完全相同的停顿。
不用担心下雨,只要确保在正确的时间下雨即可。要利用后台 GC,您需要对数据进行结构化,使其生命周期非常短,因此它很容易在 gen #0/1 集合中消失。或者生活很长时间,所以它在第 2 代找到了一个舒适的家并在那里呆了一段时间。这通常是程序中非常常见的模式,尤其是在游戏中。您几乎不需要做任何事情。
关于c# - C#中的内存布局优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29192679/
我为 S3 做了一个额外的布局(所有布局的反叛),人们说,使用 layout-sw320dp 对 s3 有好处。一切正常,s3 选择了这个文件夹,布局在 s3 上看起来很棒。 但是当我尝试在 10"平
我是 CSS 的新手,我正在尝试创建一个 3 列布局。也应该有一个居中的页脚。页面的总高度应该填满当前的屏幕。宽度似乎不对。 目前,页脚在尺寸和位置上似乎都没有对齐。 I have attached
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
有没有办法确定设备是从右到左的语言(比如阿拉伯语)而不是从左到右的语言(英语)? 需要与旧 API 级别(低至 10)兼容的东西 解决方案 我最终在接受的答案中使用了 xml 方法。更进一步,我还添加
我是 QT 的新手。我试图通过实现下面看到的这个小窗口来理解布局机制。它在作为主窗口的 QWidget 下具有以下元素: 一个延伸到所有客户区域的大型 QWidget。 窗口顶部的两个 QWidget
Accordion 布局是堆叠面板布局,因为此时只有一个面板可见,但我想同时显示两个面板可见,所以我们可以使用 Accordion 面板来做到这一点吗?? 最佳答案 您不能扩展现有的 Accordio
我只是想知道,作为一个假设示例,针对以下场景布局表格的最佳方式是什么: 假设我正在编写一个用于跟踪学生出勤的应用程序。每年年初,我都想添加所有学生(我将手动执行此操作 - 现在,是否应该为这里的每个学
在 CVS 中,我们的项目中有多个目录。 有一个夜间构建,它必须从同一个 CVS 项目的不同目录中提取东西才能构建夜间构建。所以我应该记住这一点,如果我们迁移到 SVN,我必须修改构建脚本以从不同的存
我在 WPF Windows 上有几个列表框,带有 Height="Auto" Width="Auto"在表格上设置 表单大小在不同分辨率下完美匹配,但问题是当我按下最大化按钮时,在表单调整大小时会看
仅供引用,我是 WPF 的新手。 我正在我的 WPF 应用程序中创建一个侧边栏并想要圆角。我学到的不是可以附加到网格的属性。另外,我尝试将文本块放在边框控件中,但我收到的错误消息说“ child 只能
我是CodeIgniter的新手。我想使用包含菜单,页脚等的基本样式创建母版页或布局。我不想在所有页面中编写重复的内容并为所有页面自动加载。例如,我可以在asp.net中创建母版页,或者在asp.ne
我正在使用它来调试应用程序。调试的时候发现底部显示了一个窗口中变量的值,如图- 但是,当我显示表达式时,我得到这样的布局 - 我的问题是,是否可以更改变量窗口的布局也可以在右侧显示值,因为这对我来说很
上面的代码中,放置“as=”footer_links”是什么意思? 最佳答案 as="x" 语法定义模板可用来调用 block 的名称。因此,对于以下内容: 在outer_block.p
我试图编写一个检查注册表值的功能,以查看Windows上的控制台是否启用了颜色。 Computer\HKEY_CURRENT_USER\Console\VirtualTerminalLevel 如果您
我有一个布局,但无法提前定义其所有区域,因为它们是未知的。 稍后创建了 ItemView,我想使用 View 的 ID 作为区域名称在布局中创建一个新区域,这样我就可以说: layout.dynami
我们有一个相当复杂的 gulp 构建过程,涉及多个模块,每个模块都有一个或两个 watch 。我想在一个仪表板中监控这一点,如下所示: 每一列都是一个模块,列内的每一行都是后续的构建步骤。一旦第 1
这就是问题所在,我有一个 MainWindow 类,它在一个设置例程中扩展了 JFrame,我将该类的布局设置为新的 CardLayout()。这一切都工作正常,但是当我从 JFrame 请求布局并将
我正在制作一个简单的迷宫程序,用户可以在其中创建墙壁、路径、起点和终点,单击“解决”,迷宫将被解决。为此,我有一个大小为 640x480 的 java JFrame。在 JFrame 的左侧,我有一个
我正在使用它来调试应用程序。调试的时候发现底部显示了一个窗口中变量的值,如图- 但是,当我显示表达式时,我得到这样的布局 - 我的问题是,是否可以更改变量窗口的布局也可以在右侧显示值,因为这对我来说很
我已经编写了使用 VBox 作为布局的代码。我希望按钮出现在顶行,然后绘制 2 条水平线,在 400x400 场景中应位于 y=200 和 300 处。但输出显示了我给出的不同坐标处的线条。 我知道这
我是一名优秀的程序员,十分优秀!