原文
Mathis
马里奥说,Funkwerk
一直有一些内存问题,并给其交MathisBeer
了解细节.
Mathis
说,从D2.096
或2.100
左右开始,Funkwerk
一直在使用更多的内存.可惜,很难知道这是否是一个真正的问题.
他说,当你看到10GB
进程时,很难判断这是因为大量的数据,或是时间
问题,或是否有降级
.
他提到在论坛上发布的一个运行一百个
线程来创建哈希映射
,然后显式
删除它们或设置它们为null
的测试用例.
它最终剩下200kb
的GC
内存和几百兆
字节的残留,这并不令人满意.进程使用的内存只是不断
增长.
他说,有时它会稳定
,但只是因为GC
太多,以至于CPU
无法处理足够数据来进一步增长.在生产
中必须定期重启才能控制
内存使用.
他在std.json
文档中添加了一个警告,有大量数据时,不要用它.如果每个JSON
节点都有一个哈希映射
,那会打击你.
在网络上取数百兆
字节数据并处理,在线程系统中GC
很难处理.使用移动
收集器,可检查问题并增加内存
,然后再次下降.
但这在D中从根本上是不可行的.除了警告
,他无能为力.
Walter
指出,D
的GC
在收集
内存时,不会返回内存
给操作系统.它只是在增加.Mathis
说他们一直在手动
调用最小化,但是如果池中
有一两个错误
的引用,则不行.
Walter
同意移动
收集器,但没有,因为无法可靠地找到所有引用
或证明它们都是有效
的引用.所以只能这样.
Mathis
说,他一直在怀疑,在大型池中有些栈上
挂起的无用
引用.但不能证明.
它们存在,是因为它们在恰好调用
函数时不会覆盖的某个8字节
区域.他想知道是否有可在GC
中断栈的给定点,获得栈的指针数据
.
就像在给定点有每个
寄存器做什么,每个字节做什么的细节.
Walter
说,他们可以,对接近调用栈
根的函数,一旦使用完内存,就可把引用
设置为null
.可帮助解决该问题,这是他唯一能想到的;
完成操作后,只需把引用
设置为null
,这样就不会在栈上徘徊.Mathis
说,问题是关联数组
没有这样做.他们可把引用
设置为null
,但运行时函数不会自行清理
,从而悬挂
引用.
Mathis
说他们没有活变量
.他们的理论是,进入GC
时,会跳过
在栈指针上方的东西.进入函数
前,几乎可调用500
字节或2kb
的alloca
来摆脱它.
Walter
建议使用assert(0)
来取栈跟踪
,这样就可查看哪些函数
仍在栈上,然后转到这些
函数查找悬挂引用
.
Igor
第一个问题与Funkwerk
的问题有关.他们使用std.json
来解析数百兆字节的JSON
.在多线程应用中,它非常慢.
调查发现是由GC
中的全局锁
引起的.而文档
中未提及这一点.这是个重要的性能
属性,应明确记录.
方法切换std.json
为另一个库,一切正常.
C++
串
伊戈尔说,他们正在与许多C++
的人工智能/机器学习
库对接.可惜,D
与C++
的std::string
的绑定仅限于旧的C++API
.在新API
中,std::string
的内存布局有个内部指针
.
D的运行时
模型中不支持它,因此D无法绑定
到新串
.解决方法是用旧的C++API
编译C++
代码.这有效,但这很烦人,因为你必须全部编译
所有源代码.
因此,如果有人提供了针对较新的C++API
编译的预编译库,则不能直接
使用它.如果可以,解决
该问题会很好.
MathiasLang
说C++
串是引入复制构造器
和弃用postblit
的全部原因.
C++
互操作文档
接着,Igor
说D的C++
接口文档不完整
.如,他们不知道可在D
中抓C++
异常.
Walter
说未文档化,是因为不适合某些C++
编译器.与微软C
编译器一样.无法抓
他们的异常
.
伊戈尔说没关系,因为他们使用的是Linux
.沃尔特说他明白了.然后解释说,它不适合MS
异常处理机制,因为他无法
确定它工作原理.
他说,32
位异常
的文档一目了然,但他可让它工作.64
位MS
实现的文档非常令人困惑
,他放弃了它.在POSIX
系统上,它是相当标准化
的,所以很容易弄清楚.
因此,只要你不使用MSC++
,就可以.不过,应该更新
文档以说明它适合Linux
和POSIX
系统.
MathiasLang
问他们在Linux
上使用哪个编译器.伊戈尔说.Mathias
说,GDC
和LDC
会通过隐藏指针
传递大量对象,因此会避免
在互操作
中遇见C++
错误.
他建议继续使用LDC
.
伊戈尔同意了.他说真应该更新有关此的文档,即使它不适合MS
.这一点很重要,你可在Linux
上轻松使用C++
互操作,是个非常好的属性.
如果有可能在窗口
上修复C++
异常处理,也许是通过付钱给某人或通过GSOC
或SAOC
项目,那就太好了.对接C++.
vibe.d
伊戈尔说,使用vibe.d
时,编译时会从vibe.d
内部收到两个屏幕
的弃用警告.他看到了一个Bugzilla
问题和一个关于它的论坛帖子,这很好,但唯一的方法是全局禁止
弃用警告.
但表明
无法看到可修复代码的弃用
警告.这有点烦人.
沃尔特说,晚些时候会谈论弃用.MathiasLang
指出,已在master
中修复了Igor
提到的指定vibe.d
弃用,只是还没有新版本,Igor
说这很漂亮.
MathisBeer
表示,Funkwerk
做了一些作弊的事情,并且有可能
破坏:他们拆分
弃用的库,并用弃用链接他们自己的代码.有模板时,这会破坏
.
卡斯滕(Carsten)
遇见的唯一
问题是移植加密库
到Android
和iOS
时遇见了一些挑战,但现在已解决了该问题.他说,主要是因为他们不了解Android
工作原理.
他们已构建
了自己的系统,使用BDD
(行为驱动开发)自动生成D代码
,然后在那里编写单元测试
.带单元测试的BDD
工作流有效.
他们使用自己的受到BSON
的启发叫HIBON
(有不变二进制对象符号),而不是JSON
的数据格式.使用HIBON
,生成数据结构
时,可保证加密类
是相同的.
因此,字节组织方式与工作位置
无关.
想发布HIBON
,因为原则上可用来序化.他们已内置了它,且易于使用.多亏了内省
,可插件一个HIBON
记录,然后序化或构造
类或构.
它使得更易使用流程
.数据库中的所有内容
都存储在HIBON
中.他们甚至有个叫HIRPC
的签名的远程过程调用
.
也即,不是请求许可
,而是对RPC
签名,以便在收到它时知道你是否有权执行某些操作.
有时会遇见
弃用问题,但他们只是解决
了这些问题并继续前进.除此外,他们之前在单元测试
中运行多线程
时,确实遇见了问题,这可能不是个好主意.
有时,在多线程时测试
会失败,且会泄漏
到所有其他测试.但是自从转向使用BDD
后,就没有该问题了.
atila
说,并行
运行单元测试
可能很好,因为可发现
是否做错了什么.他问如何并行
运行它们.卡斯滕说,他们没有并行测试
.
但是,如,如果有线程
测试,比如并发
测试或其他什么,且失败了,则实际似乎不可预测它.阿蒂拉说这是因为异常
被吃了.Carsten
说,他们还看过atila
的单元线程库
这里,并想在以后合并它.
纪尧姆
接着,说他分发
共享库给很多客户.他想强调,自包含
的共享库是D的有效
用法.因为他不控制主机,所以这时,共享
标准库和共享DRuntime
可能是一个问题.
最后,他说想在所有D编译器
中看到Objective-C
支持.
沃尔特
Walter
说,应该不弃用
不会伤害
语言的东西.不会仅因为它们是老式
的,或因为有更好
方法等而删除
它们.该想法
是向后兼容
,因为人们讨厌
获得试使用的旧D包
,但屏幕
充满了弃用
消息.
所以必须停止
这样做.
提出并部分实现
的替代方法是用可为过时
的东西打印
警告的-wo
开关.想法是,与弃用
警告一样,这不是编译器
默认的;
必须
主动取消息.最好,人们不会因为改进语言
而烦恼.仍编译
过时功能,只有在请求
时才会收到
警告.
而不会受弃用消息
困扰.只会弃用
并删除
真正有破坏性和有问题
的内容.
还有个问题
是,某些弃用
针对导致代码不安全
的功能.这里问题
是编译器无法证明代码
是安全的.不表明代码不安全
或破坏.
因此,他计划修改它,以便只有在修复
了有关传统行为
的所有警告后,才能在@safe
代码中获得编译器保证
.这不会破坏现有的,有效的,经过调试的
代码,但是如果想让编译器保证安全,必须打开-wo
并修复它给你的警告.
同样,想法是让人们可继续使用较旧的,经过调试
的工作库,而不会从编译器那里得到大量的抱怨.像vibe.d
此项目不会在每次有新版本
编译器时自动中断
,或至少不会故意
因充满弃用
消息而中断.
使用vibe.d
的人不必受编译vibe.d
带来的弃用
消息所困扰,是完全合理的,因为破坏
了现有项目,给它留下了非常糟糕的印象和愤怒
.
他已发送了一些来恢复一些不需要弃用的,但破坏
人们代码的PR
.他们没有伤害
.还与丹尼斯说,要求他优先在类
上恢复
别名本(alias this
)的弃用.
不必弃用
它.在语言
中使用它很烦人
,但是人们不能简单
替换它.因此,前进
道路不是改进或修复
它,这是无法做到的,也是首先弃用它的原因.而是鼓励
人们不要使用它.
保留
它,以便可工作,代码
编译,但可让-wo
开关警告它.
Carsten
问是否可按模块级
或包级
设置标志
以启用或禁止
警告.开始了关于允许-wo=foo
和/或-d=foo
的相当长的讨论,及foo
应该是模块还是包
,还是文件系统上的目录
.
Walter
对-wo
的意图是,允许在没有警告
时编译旧代码
,而无需用户更改.如果要求用户
更改构建系统来禁止
警告,则需要用户更改
.
应该有比-wo
更好的回应.它必须是w0=
,然后是包名列表
等.改良坏主意,可能是个好主意.看看保时捷911
就知道了.早期原型是辆可怕
的汽车.它只是丑陋
.然后他们只是改变
了pit
,就变成了一辆很好
的车.
最后,Walter
说可增强-wo
,给它适用的模块列表
.这很合理.
老实说,我很震惊,短短几年内,已从DIP1028
和默认@safe
变成了以向后兼容性
名义放弃安全
.
不仅是你.DIP1000
的文档确实很少,设法
弄清楚它的人需要更多
帮助.