2015D会议上

1地址
2地址
幻灯片地址在http://dconf.org/2015/2016里面找.
问:沃尔特和安德烈,是否引入.答案:!.
Walter Bright,分配内存策略:尽量惰性,不分配区间,分配策略应交由更了解数据生命期和使用模式用户,才能做出最佳选择.
呼吁要求用返回区间来代替返回数组.来使d标准库无垃集编程更高效和友好.


Daniel Murphy/yebbliesddmd,翻译C++D源码.在此,翻译原因:D更易编写,提高士气,更易重构,并提供可提高性能的新功能.而SDC是从头编写的.
C++预处理器和实际语言的语义组合起来语言.因而D放弃预处理器.花了2年多.


Brian Schott(libdparse作者,飞行员),讨论了dfmt,D风格的检查器.DCD补全.如dscanner -d some_symbol_name source/*.d.比grep有优势.
SIMD,可通过扫描无用示例,来优化.dfix目标是作为重构代码工具.这是自动修复代码并帮助迁移到新编译器版本的程序,首先是能重命名模块或函数并自动更新其实例.这很难.


Liran Zvibel(Weka.io)使用d.
为了获得最佳性能,他们编写了零复制,无分配和无锁的高效内存代码.为了更易理解代码,他们用了纤程,反应器和基于D的编译时反射的RPC框架.
写了个libdparse和静态生成代码自定义跟踪框架辅助代码,及二进制存储系统,存储而非来最快.而无锁移动系统到共享内存允许它在不暂停系统下快速记录有用信息.
并介绍了用编译时反射通过查看常规D接口声明来生成与远端节点通信代码的IPC系统,D食谱第8/9章有相应基础技术.作者:这种生成技术编译时速度有影响.不是用插件(代码),而是用pragma(msg)来输出,然后用makefile来保存至文件再利用相应缓存.
Liran说,该方法,比使用C的外部工具简单多了,且运行时仍然相当高效.还编写了自定义断言和反射助手,创建了本地光纤存储和光纤调试助手及许多无垃集高效数据结构.
挑战:垃集无用,编译器占用太多内存,无法扩展使用所有内核.AA说,可尝试一次打包编译,可更好并行,且避免模板实例化的边角情况.我指出迁移到ddmd后要修复并行化使用内存问题.
gdc/ldc链接时优化,而dmd没有.还有C函数需要内联来获得良好性能,而D中没有.还有小于整类型提升问题,私导入用途不大.同时由于循环导入/排序问题,模块构造器/析构器用处不大.值区间传播,在正确性/方便性上还差点.
D替换py/C,极大提高了他们的生产力,他们大量使用D的独特特征,这是值得的.唯一大的缺点的是还可更好支持大型实时项目,而该演讲是他们成功用D构建大型实时项目.


David Nadlinger,druntime的实现.讲解了druntime的包和一些如TypeInfo和ModuleInfo类.他描述了异常处理,指出它是编译器/平台相关的.并概述了标记和清除垃集原理.
并讨论线程本地存储的实现,并与共享库工作的挑战.没必要有个静每线程表,表明存储在哪.可在多个程序中加载动态库.
W.B说,由于间接查找,线本全局变量没有,访问局部变量(快得多)高效.
David还描述了纤程的工作原理,注意,用纤程实现TLS和异常比较难.详细介绍了共享库和注册模块,描述_Dmodule_ref工作.它是编译器用C全局构造函数创建的模块链表.d内核代码中你应该见过.这里引用空针原因是,你写自己的_start,跳过C运行时初化,根本没跑构造器.现在是_d_dso_registry函数,这是编译器生成调用,由Martin Nowak编写.
--gc-sections选项,可能不管用,但管用时,可减小ldc2大小.


Amaury Sechet/deadalnix,讲了内存,CPU 缓存,并发防护.内存很慢,要放在cpu缓存中.列出些缓解慢速内存问题的重要技巧:1,打包数据来减少占用内存.2,尽量放栈上(热缓存).3,线性访问数据避免间接访问和分支代码(帮助预取器抓正确内容).4,调整数据大小,使其适合缓存行.
CPU缓存一致性的基础是,内核拥有缓存行的所有权,并在不脏时共享.提示我们避免共享和写入内存,即尽量共享不变数据并写入线程本地数据.D也鼓励用线本数据.
如要跨多线程共享可变内存,确保共享块占用完整的64字节,避免跨线程同块的两个不同共享变量在多个缓冲行.
虽然x86尝试自动保持内存一致性,但也不能过多降低性能,如StoreLoad内存栅,要x86上要显式.这由mfence触发.作者说:D通过内联汇编公开,我相信内在(intrinsics),arm要求明确指定所有内存栅.
很难测试这些问题.D默认线本,显式共享,多核仍可依赖的传递不变,可帮助.
共享都很难使用,应该小心使用.垃集/d运行时/编译器接口多核友好.sdcAmauryd编译器的重写,用制作线程局部堆.用写栅来帮助gc暂停.因而占用更多内存,一般只用共享不变值.问题:不变闭包D中可能有可变上下文指针,终止线程时异常可能跨线程行.
父调用Thread.join时,可能抛干掉线程的异常.分配后,提升为不变,垃集如何知道在不变堆中分配?提出:对不变信息分代垃集.加更好检查转义引用,并自动释放它们,尽量移动至.并改进内联器来最大化效果.

posted @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示