- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我最近看到了两个非常好的和有教育意义的语言讲座:
This first one由 Herb Sutter 撰写,介绍了 C++0x 的所有漂亮和酷炫的特性,为什么 C++ 的 future 似乎比以往任何时候都更加光明,以及 M$ 如何被认为是这个游戏中的好人。演讲围绕着效率以及最小化堆事件如何经常提高性能。
This other one ,作者 Andrei Alexandrescu,插入了从 C/C++ 到他的新游戏规则改变者 D 的过渡。 D 的大部分东西似乎都非常有动力和设计。然而,让我感到惊讶的是,D 插入了垃圾收集,并且所有类都是通过引用单独创建的。更令人困惑的是,The D Programming Language Ref Manual 一书特别在关于资源管理的部分中陈述了以下内容,引用:
垃圾收集消除了繁琐、容易出错的内存分配跟踪代码在 C 和 C++ 中是必需的。这不仅意味着更快的开发时间和更低的维护成本,但生成的程序经常运行更快!
这与 Sutter 一直在谈论最小化堆事件相冲突。我非常尊重 Sutter 和 Alexandrescou 的见解,所以我对这两个关键问题感到有些困惑
仅通过引用创建类实例不会导致大量不必要的堆事件吗?
在哪些情况下我们可以在不牺牲运行时性能的情况下使用垃圾回收?
最佳答案
直接回答你的两个问题:
是的,通过引用创建类实例确实会导致大量堆事件,但是:
一个。在 D 中,您有 struct
以及 class
。 struct
具有值语义,并且可以做类可以做的所有事情,除了多态性。
b.由于 slicing problem,多态性和值语义从来没有很好地协同工作。 .
c。在 D 中,如果您确实需要在某些性能关键代码中在堆栈上分配一个类实例并且不关心安全性的损失,您可以通过 scoped
执行此操作而不会造成不合理的麻烦。功能。
如果满足以下条件,GC 可以与手动内存管理相当或更快:
一个。您仍然尽可能在堆栈上进行分配(就像您通常在 D 中所做的那样),而不是依赖堆来处理所有事情(就像您在其他 GC 语言中经常做的那样)。
b.你有一个顶级的垃圾收集器(D 当前的 GC 实现确实有点幼稚,尽管它在过去的几个版本中看到了一些主要的优化,所以它没有以前那么糟糕)。
c。您分配的主要是小对象。如果您分配大部分大型数组并且性能最终成为问题,您可能希望将其中一些切换到 C 堆(您可以访问 C 的 malloc 并在 D 中释放),或者,如果它具有作用域生命周期,则其他一些分配器如 RegionAllocator . (RegionAllocator 目前正在讨论和完善,以便最终包含在 D 的标准库中)。
d。你不太关心空间效率。如果您让 GC 运行过于频繁而无法将内存占用保持在超低水平,那么性能将会受到影响。
关于c++ - 到 GC 或不到 GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7575055/
我正在尝试在 Windows 上运行的小于 1GB 的 VM 上设置 YouTrack 和 TeamCity。使用率将非常低(用户和请求)。这是一个 POC 环境,如果它有效,我可能会将它推送到一个超
所以我在尝试使用 FORFILES 解决这个问题时遇到了麻烦。我正在尝试获取不超过 4 天的文件。所以基本上少于 4 天。然而,这似乎不太可能,因为/d -4 获取所有 4 天或更早的项目。 以下是我
如何从下面的 events 表中选择小于 15 分钟前创建的 events? CREATE TABLE events ( created_at timestamp NOT NULL DEFAU
Google Analytics Realtime提供 rt:minutesAgo ,可以过滤查询。 然而,它是一个维度而不是一个度量标准,<=不能在过滤器中使用。 假设我想在最后 n 分钟内获得一些
iOS 核心数据 - 严重的应用程序错误 - 尝试插入 nil 你好, 我的应用程序实际上运行稳定,但在极少数情况下它会崩溃并显示此错误消息... 2019-04-02 20:48:52.437172
我想制作一个 html div 以快速向右移动(例如不到 1 秒)并消失。然后1秒后再次直接出现在这个过程最开始div的位置。此过程将由单击按钮并重复 10 次触发。 我试图在 CSS 中使用过渡属性
我发现使用 TimeTrigger 是 Windows 10 (UWP) 上计划后台任务的方式。但是看起来我们需要给出的最小数字是 15 分钟。只是想知道,即使我们安排它在接下来的 1 分钟内运行,警
我必须在 1 秒内在屏幕上打印 2^20 行整数 printf 不够快,还有其他易于使用的快速输出替代方法吗? 每一行只包含 1 个整数。 我要求它用于竞争性编程问题,我必须将其源代码提交给法官。 最
我是一名优秀的程序员,十分优秀!