云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

网站建设_新公司网站建设_代金券

小七 141 0

抗癌:开源代码的意外好处

最近,伦敦癌症研究所的Igor Kozin博士联系了我。他询问了编译CloudFlare的zlib开源fork的最佳方法。事实证明,zlib被广泛用于压缩用于DNA测序的SAM/BAM文件。我们的zlib fork是该文件格式的最佳开源解决方案。CC BY-SA 2.0图片作者:Shaury Nash用于这类研究的文件达到数百GB,每次使用我们的库压缩和解压时,都会节省许多重要的秒数,从而使癌症的治疗更加接近。至少当我上床睡觉的时候我会告诉自己。这让我意识到开源的好处远远超出了人们的想象,而且你永远不知道一段代码会在哪里结束。开放源代码使得那些没有资源独立开发它们的个人和组织能够访问复杂的算法和软件,或者为专有解决方案支付资金。这也让我想知道我们到底对zlib做了什么,使它从其他zlib分支中脱颖而出。扼要重述Zlib是一个压缩库,支持两种格式:deflate和gzip。这两种格式使用相同的算法(也称为DEFLATE),但具有不同的头和校验和函数。这里描述了deflate算法。这两种格式都受到绝大多数web浏览器的支持,我们CloudFlare使用gzip格式动态压缩所有文本内容。此外,PNG文件格式也使用DEFLATE,我们的zlib分支也加快了图像优化引擎的抛光。你可以在这里找到pngcrush的优化分叉。考虑到我们必须处理的流量,压缩优化对我们来说确实有意义。因此,我们对默认实现进行了一些改进。首先,了解zlib的现状是很重要的。这是一座非常古老的图书馆,是至今仍在使用的最古老的图书馆之一。它是如此古老,它是用K&R C编写的。它是如此的古老,USB还没有发明。它太老了,所以DOS还是个东西。太老了(在这里插入你最喜欢的笑话)。更确切地说,它可以追溯到1995年。回到那些有64KB可寻址空间的16位计算机仍然在使用。尽管如此,它仍然代表着有史以来最好的代码之一,即使对其进行现代化改造,也只能带来适度的性能提升。这显示了它的作者的高超技艺和自1995年以来编辑者的漫长历程。下面是我们的zlib分支的一些改进的列表。这项工作是由我,我的同事杨树新完成的,还包括其他来源的改进。默认值为16位uInt类型。使用改进的哈希函数-我们使用iscsicrc32函数作为zlib中的哈希函数。此特定函数在英特尔处理器上作为硬件指令实现。它具有非常快的性能和更好的碰撞性能。搜索至少4个字节的匹配项,而不是格式建议的3个字节。这样可以减少散列冲突,减少在无关紧要的匹配上浪费的精力。对于大多数情况(但不是全部),它也会稍微提高压缩率。使用SIMD指令滚动窗口。使用硬件无进位乘法指令PLCMULQDQ进行CRC32校验和。优化的最长匹配函数。这是库中对性能要求最高的函数。它负责在当前窗口中查找(长度、距离)匹配项。此外,我们还有一个实验分支,它实现了zlib中使用的链表的改进版本。它在保持相同的压缩比的情况下,在压缩级别为6到9时具有更好的性能。你可以在这里找到实验分支。标杆管理你可以在这里和这里找到我们图书馆的独立基准。此外,我还进行了一些内部基准测试,并将结果放在这里以方便您。所有的基准测试都是在i5-4278U的CPU上执行的。压缩是在一个ramdisk之间进行的。所有库都是用gcc版本4.8.4编译的,编译标志为:"-O3-march=native"。我测试了主zlib fork的性能,由Intel、我们自己的主分支和实验分支优化了实现。基准使用了四个数据集。卡尔加里语料库,坎特伯雷语料库,大型坎特伯雷语料库和西里西亚语料库。卡尔加里语料库性能:压缩率:在这个基准测试中,Intel只在1级上优于我们的实现,但代价是文件的1.39倍。这种差异甚至远大于1级和9级之间的差异,可能应该被视为不同的压缩级别。CloudFlare在所有其他级别上都更快,并且在6到9级别上表现显著优于其他级别。对于这些级别,实验性实现甚至更快。坎特伯雷语料库性能:压缩率:这里我们看到了类似的情况。1级的Intel得到1.44倍大的文件。对于9级FLARE,速度更快。在级别9上,实验分支的性能比参考实现高出2倍。大型语料库性能:压缩率:这一次,Intel在5级和6级上的速度比CloudFlare实现稍快。实验性的CloudFlare实现在级别6上仍然更快。Intel level 1的压缩率比CloudFlare低1.58。在第9层,实验叉是7.5X(!)比参考快。西里西亚体性能:压缩率:在这里,CloudFlare在2到9级是最快的。在第9级,实验拨叉和参考拨叉之间的速度差为2.44倍。结论从基准测试中可以明显看出,CloudFlare实现在绝大多数情况下都优于竞争对手。我们花了很大的努力使它尽可能快地在我们的服务器上。如果您打算使用我们的库,您应该亲自检查它是否为您的数据集提供了性能和压缩的最佳平衡。由于不同的文件格式和大小,性能可能会有所不同。如果你喜欢开源软件,别忘了回馈社区,贡献你自己的代码!