Tag: d

线程本地存储为什么这么慢?

我正在为D编程语言的自定义标记释放样式内存分配器工作,通过从线程本地区域分配。 看起来线程局部存储瓶颈导致了从这些区域分配内存的速度(〜50%)相比于其他相同的单线程版本的代码,甚至在devise我的代码后,每个分配/释放。 这是基于在一个循环中分配/释放内存很多次,我正在试图弄清楚它是否是我的基准testing方法的人为因素。 我的理解是线程本地存储基本上只需要通过一个额外的间接层来访问某些东西,类似于通过指针访问一个variables。 这是不正确的? 线程本地存储通常有多less开销? 注意:尽pipe我提到了D,但是我也对D中没有特定的一般答案感兴趣,因为如果D的实现比最好的实现慢,D的线程本地存储的实现可能会改进。

编译器能否自动检测纯函数,而不需要关于纯度的types信息?

所以我和我的朋友争辩说,像GCC这样的编译器可以自动检测一个纯函数而没有任何types的信息。 我不信。 像D或Haskell这样的语言在他们的types系统中具有纯度,程序员明确地定义了什么函数是纯粹的。 一个纯函数没有副作用,因此很容易被并行化。 所以问题是:这是否是必要的? 一个编译器是否可以检测到纯度,没有任何元或types的信息,只要假设IO或自动访问全局variables的任何东西都不是纯粹的?

D编程没有垃圾收集器

我今天一直在看D,表面上看起来相当惊人。 我喜欢它如何在语言中直接包含许多更高层次的构造,所以不必使用愚蠢的黑客或简洁的方法。 有一件事真的让我担心,如果GC。 我知道这是一个很大的问题,并且已经阅读了很多关于它的讨论。 我自己从这个问题萌生的简单testing表明GC非常慢。 比直接C ++做同样的事情要慢10倍以上。 (显然,testing并不直接转化为现实世界,但是性能打击是极端的,会减缓真实世界发生的类似行为(快速分配许多小对象) 我正在研究编写一个实时低延迟audio应用程序,GC可能会破坏应用程序的性能,使其几乎无用。 从某种意义上讲,如果它有任何问题,将会毁掉实时audio方面,因为与graphics不同,audio以更高的帧速率(44000+ vs 30-60)运行。 (由于它的低延迟比标准的可以caching大量数据的audio播放器更重要) 禁用GC可将结果提高到C ++代码的20%左右。 这很重要。 我会在最后给出代码进行分析。 我的问题是: 用一个标准的智能指针实现代替D的GC是多困难的,这样依赖于GC的库仍然可以被使用。 如果我彻底删除GC,那么我将失去很多烦琐的工作,因为与C ++相比,D已经有了限制库。 GC.Disable只暂时停止垃圾回收(阻止GC线程运行),并且GC.Enable会在停止的地方回收。 所以我可能会禁用GC在高cpu使用时间运行,以防止延迟问题。 有什么办法强制一个模式,不要一直使用GC。 (这是因为我没有在D编程,当我开始写我的眼镜不使用GC我想确保我不会忘记执行自己的清理。 是否可以轻松更换D中的GC? (不是我想要的,但有一天玩不同的GC方法可能很有趣…这与我想的类似) 我想要做的是交易记忆的速度。 我不需要GC每隔几秒就运行一次。 事实上,如果我可以正确地实现自己的数据结构的内存pipe理,那么根本就不需要经常运行。 只有当内存稀less时,我才需要运行它。 从我读过的东西看,尽pipe如此,你等待的时间越长,它就越慢。 由于在我的应用程序中通常会有一些时间,我可以不经问题就调用它,这将有助于缓解一些压力(但是再次,可能会有几个小时我将无法调用它)。 我并不担心内存限制。 我宁愿在速度上“浪费”内存(当然,最多也是一个点)。 首要的是延迟问题。 从我读过的内容来看,只要我不使用任何依赖GC的库或语言结构,我至less可以走C / C ++的路线。 问题是,我不知道那些做的。 我已经看到string,新的等提到,但这是否意味着我不能使用string的构build,如果我不启用GC? 我读过一些错误报告,说GC可能是错误的,这可以解释它的性能问题? 此外,D使用了更多的内存,事实上,D在C ++程序之前耗尽内存。 在这种情况下,我想这大概是15%左右。 我想这是给GC的。 我意识到下面的代码并不代表你的平均程序,但是它说的是,当程序实例化很多对象时(比如在启动时),它们会慢得多(10倍是一个很大的因素)。 GC可以在启动时“暂停”,那么它不一定是个问题。 真正好的是,如果我能以某种方式让编译器自动GC一个本地对象,如果我没有具体释放它。 这几乎是两全其美。 例如, { Foo f […]

D语言是否有多个标准库和GC问题?

我想知道D是多么成熟和稳定,如果它可能是C / C ++的好替代品。 我知道现在有两个标准库(Phobos和Tango)。 还是没有统一的标准库? 此外,我前一段时间听说,语言在GCed / non-GCed代码的边界上存在问题。 我在D网站上找不到任何关于这方面的参考,那么这个问题仍然是真的吗?

DMD vs. GDC vs. LDC

不同的D编译器有哪些优点/缺点? 性能和标准符合性/ D2支持如何? debugging器支持多好? 错误消息有多好,是IDE集成? 64位支持有多好? 我的想法到目前为止: DMD 成熟和良好的维护 只有一个平台,64位支持不好 不是FOSS GDC 支持各种平台 有非常成熟的优化,所以它很快? 过时的运行时间? GCC这么好的debugging器支持? LDC 支持各种平台 LLVM,所以它支持JITing? 有非常成熟的优化,所以它很快? 维护得不是很好? 过时的运行时间? 死/不工作 宕 SDC MiniD – 非常非常好,但不是D(虽然从来没有声称过) 我正在考虑瞄准ARM,我认为GDC是select的工具,但我不确定。

D的语法真的是上下文吗?

我已经在几个月前在D新闻组上发布了这个消息,但是由于某种原因,答案从来没有真正让我信服,所以我想我会在这里问。 D的语法显然是上下文无关的 。 但是,C ++的语法不是(即使没有macros)。 ( 请仔细阅读! ) 现在被授予, 我对编译器,词法分析器和parsing器一无所知 (正式)。 我所知道的是从我在网上学到的东西。 以下是我所了解的关于上下文的一些(我相信),用不太专业的术语: 语言的语法是上下文无关的, 当且仅当你总是可以理解给定代码段的含义(尽pipe不一定是确切的行为),而不需要在其他地方“看”。 或者,更不严格的是: 如果我需要的话,语法不能是上下文无关的,我只是通过查看它不能告诉expression式的types。 因此,例如,C ++由于confusing<sizeof(x)>::q < 3 > (2)的含义 取决于q的值 ,因此上下文无关testing失败。 到现在为止还挺好。 现在我的问题是:D可以这样说吗? 在D中,哈希表可以通过Value[Key]声明创build,例如 int[string] peoplesAges; // Maps names to ages 静态数组可以用类似的语法来定义: int[3] ages; // Array of 3 elements 和模板可以用来使他们感到困惑: template Test1(T…) { alias int[T[0]] Test; } template Test2(U…) { alias […]

游戏开发的D语言

最近我一直在困扰,因为我到了一个C ++(甚至0x)感觉非常有限的点,所以我开始寻找替代品。 忘记Java,C#,Python或Ruby。 我仍然喜欢C ++的低级特性,我不喜欢虚拟机。 而且,我是一名游戏引擎开发人员,所以我必须开发核心例程,这个例程必须非常快速,最近我一直渴望代码performance力。 C ++对我来说几乎是一种语言,但是如何使用模板有很多例外,而且GCC并没有像我希望的那样优化内容。 所以我正在考虑开始学习D. 你认为这足以满足游戏开发者的需求吗? 我很警惕,因为我从来没有听说过D被用于这个。 谢谢!

在C ++和D中进行元编程

C ++中的模板机制只是偶然地对模板元编程有用。 另一方面,D的devise是为了方便这个。 显然这更容易理解(或者我听说过)。 我对D没有经验,但是我很好奇,在D中你能做什么,在模板元编程中你不能用C ++呢?

GC或不GC

我最近看到两个非常好的教育语言会谈: Herb Sutter 首先介绍了C ++ 0x的所有优秀特性,为什么C ++的未来似乎比以前更加光明,以及M $如何被认为是这个游戏中的一个好人。 这个话题围绕着效率展开,以及如何最小化堆活动通常会提高性能。 另一个由Andrei Alexandrescu推动,从C / C ++转换到他的新游戏改变者D。 D的大部分东西看起来非常有动力和devise。 但是,有一件事让我感到惊讶,就是D推动垃圾收集,所有的类都是通过引用创build的 。 更令人困惑的是,在“ 资源pipe理 ”部分特别指出了“D编程语言参考手册”中的下列内容: 垃圾回收消除了在C和C ++中所需的单调乏味,容易出错的内存分配跟踪代码。 这不仅意味着更快的开发时间和更低的维护成本,而且最终的程序运行速度更快 ! 这与萨特关于最小化堆活动的不断讨论相冲突。 我非常尊重Sutter和Alexandrescou的见解,所以我对这两个关键问题感到有点困惑 不通过引用创build类实例会导致很多不必要的堆活动吗? 在哪些情况下我们可以使用垃圾收集而不牺牲运行时间性能?

D为什么0.1 + 0.2 == 0.3?

assert(0.1 + 0.2 != 0.3); // shall be true 是我最喜欢的一个语言使用本机浮点运算的检查。 C ++ #include <cstdio> int main() { printf("%d\n", (0.1 + 0.2 != 0.3)); return 0; } 输出: 1 http://ideone.com/ErBMd python print(0.1 + 0.2 != 0.3) 输出: True http://ideone.com/TuKsd 其他例子 Java: http : //ideone.com/EPO6X C#: http : //ideone.com/s14tV D为什么不是这样? 理解D使用本地浮点数。 这是一个错误? 他们是否使用一些具体的数字表示? 别的东西? 很迷惑。 d import […]