• 参攷 2.6.0 Release News 的性能提升章节

    • 由于移除了对 $SAFE 临时赋值的支持,提升 Proc#call 的速度。[功能 #14318]

    通过 lc_fizzbuzz 多次使用 Proc#call 的 benchmark 我们测量到了 1.4 倍性能提升 [漏洞 #10212]

    • 提升了当 block 是代码块参数时 block.call 的性能。[功能 #14330]

    通过与 Ruby 2.5 中引入的提升代码块传递的性能的方法结合,Ruby 2.6 进一步提升了传递代码块调用时的性能。通过 micro-benchmark 我们观察到了 2.6 倍性能提升。[功能 #14045]

    瞬态堆是用于管理指向特定类(Array、Hash、Object 和 Struct)短生命周期内存对象的堆。例如,创建小而短生命周期的哈希对象的速度提升到了 2 倍快。根据 rdoc benchmark,我们观察到了 6% 到 7% 的性能提升。

    • 协程采用了原生实现(arm32arm64ppc64lewin32win64x86amd64)显著提升了 Fiber 的性能。 [功能 #14739]

    Fiber.yieldFiber#resume 方法在 64 位 Linux 上提升了 5 倍性能。对于使用 Fiber 密集的程序,约有最高 5% 的性能提升。

    这些提升都不是 JIT 带来的,Ruby 2.0 以来的每个大版本都有类似的性能优化。

  • 装个旧版本的 Virtualbox,再在里面跑 Linux(逃

  • 这样递减的 sql 怎么写 at 2018年12月31日

    这个基本上和财务数据的逻辑是一致的,是一个类似单向(qu)链(kuai)表(lian)的结构。中间有一个节点变化,至少会引起之后所有的数据都必须要重算。最坏的情况是变更第一个值,就不得不触发全表重建。

  • 这样递减的 sql 怎么写 at 2018年12月31日

    这样的查询适合单独存一张表吧,否则的话,每次做一定是扫全表,时间复杂度是 O(n+m),放在数据库里做好像没有什么意义啊。

  • 这样递减的 sql 怎么写 at 2018年12月31日

    还是没懂,你要不要列一下计算过程

  • 这样递减的 sql 怎么写 at 2018年12月31日

    是说 A 的 id 是主键,B 的 id 是 A 的外键。然后 n 是初始值,m 是每次 action 的消耗。d 返回经过每次消耗后的剩余的集合?

  • 不知道为什么我一访问 Edit Profile 页面就直接 302 回主页了,看来等会要回报 bug。

  • Ruby 2.6.0-rc1 已发布 at 2018年12月19日

    在关注 AutoFiber 和 Guild 的发展情况。。。如果 AutoFiber 被实现得很好的话就没什么价值了。如果 AutoFiber 有一些问题,特别是现在可能和 Guild 冲突。而 Midori 可以依赖 Guild 实现更复杂的多核异步模型的话,速度会再快几倍。但现在这俩玩意的状态我也看不太懂,所以也不知道怎么弄了。。。

  • 关于开源代码的事 at 2018年12月15日

    源代码放出来只是让你看,并不能让你用。就像别人放在那里的芒果,你不能寻思是别人不要了吧。

    代码是不是开源,需要取决于使用什么授权协议。哪怕是 GPL 的 RedHat 也有卖商业服务的。

    如果人家没有设定任何授权协议的话,那就只能默认是 Copyright 私有了。

  • Ruby 2.6.0-rc1 已发布 at 2018年12月15日

    中央声称会优化,至于会不会就要看之后有没有相关的 patch 了。

  • 关于腾讯 API 拼 URL 的服务 at 2018年12月15日

    看了下 Rest Client 的 API,后面还是作为 Hash 参数传进去的,只是因为 Post 前面多了个参数,所以被传错地方了。于是多传一个 nil 进去就好了。

    require 'rest-client'
    require 'json'
    
    r = RestClient.post('https://httpbin.org/post', nil, params: {foo: 'bar', baz: 'qux'})
    JSON.parse(r.body)
    # => {"args"=>{"baz"=>"qux", "foo"=>"bar"}, "data"=>"", "files"=>{}, "form"=>{}, "headers"=>{"Accept"=>"*/*", "Accept-Encoding"=>"gzip, deflate", "Connection"=>"close", "Content-Length"=>"0", "Content-Type"=>"application/x-www-form-urlencoded", "Host"=>"httpbin.org", "User-Agent"=>"rest-client/2.0.2 (darwin18.0.0 x86_64) ruby/2.5.3p105"}, "json"=>nil, "origin"=>"0.0.0.0", "url"=>"https://httpbin.org/post?foo=bar&baz=qux"}
    
  • Ruby 2.6.0-rc1 已发布 at 2018年12月15日

    Rails 从 JIT 上获益现在所做的还远不够,一方面 Rails 的一个瓶颈是 I/O 模型,这一点不能靠 JIT 来解决。但有一点是可以的,就是 Rails 过深的中间件产生了过深的栈让内存调用非常吃紧。如果我们的 JIT 可以更进一步,在编译过程中对内存进行适当的优化,就可以有效提供其性能。但这一点暂时不是 2.6 的目标,但会是未来 Ruby JIT 的工作重点。

  • Ruby 2.6.0-rc1 已发布 at 2018年12月15日

    然而今天要发布 2.6.0-rc2 了。。。

  • 反过来的话,你甚至也可以在 Ruby 上跑 Jupyter 比如 https://github.com/SciRuby/iruby 另外我常用的把生产数据拉来给机器学习的方法就是在 Ruby 里做数据预处理,然后使用 https://github.com/mrkn/pycall.rb 在 Ruby 里调用 Python 再去调用 Keras 做神经网络。

  • 我测了一下。用另一个 terminal 执行 sync; echo 3 > /proc/sys/vm/drop_caches 可以把 cache drop 掉

  • Linux 对内存极端不够的场景确实是会直接 kill 掉的,这一点非常。。。但 Linux 有一个指令可以清空掉 buffer 和 cache 的内存来方便调试,你可以找一下。

  • 如果你使用 htop 查看进程的话,内存里黄色的和蓝色的这块,就分别是 buffered 和 cached 内存。

    Linux 倾向于不直接释放,并吃满内存以做缓存加速系统运行,只有当内存不够时再去释放掉。这一点在 Windows 上从 Windows Vista 中也引入了这一特性。Mac 上不出意外也是有的,只是因为你一直在用,所以被慢慢释放掉了。

  • 你测 sys_mem 的方法是 RSS,对 RSS 的定义如下

    Resident Set Size = how much memory is allocated to that process and is in RAM (including shared memory!). This includes all stack and heap memory and shared libraries, as long as they are in RAM. It does not include memory which is swapped out.

    操作系统会通过 shared memory 对内存进行缓冲(buffered),以使得重启线程或程序后能更快加载,这是 Linux 的内存管理特性,只有当系统本身内存不够用时,才会去释放这部分 buffered 的内存。程序本身不能主动释放自己的缓存内存。

  • 用 CentOS 跑了一下

    [root@6d454a5b971b /]# ruby -v
    ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
    [root@6d454a5b971b /]# vi gc.rb
    [root@6d454a5b971b /]# ruby gc.rb
    created a json file: 52866672[50.42 MB]
    init the json file at the first launch, please run again.
    [root@6d454a5b971b /]# ruby gc.rb
    ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
        sys_mem:9.48 MB, objspace_mem:4.15 MB
    3s  sys_mem:9.62 MB, objspace_mem:3.46 MB
    6s  sys_mem:9.63 MB, objspace_mem:3.46 MB
    9s  sys_mem:9.63 MB, objspace_mem:3.46 MB
    read content from file 52866672[50.42 MB]
    12s sys_mem:60.12 MB, objspace_mem:53.88 MB
    15s sys_mem:60.12 MB, objspace_mem:53.88 MB
    18s sys_mem:60.12 MB, objspace_mem:53.88 MB
    21s sys_mem:60.12 MB, objspace_mem:53.88 MB
    24s sys_mem:60.12 MB, objspace_mem:53.88 MB
    27s sys_mem:60.12 MB, objspace_mem:53.88 MB
    30s sys_mem:60.12 MB, objspace_mem:53.88 MB
    33s sys_mem:60.12 MB, objspace_mem:53.88 MB
    36s sys_mem:60.12 MB, objspace_mem:53.88 MB
    39s sys_mem:60.12 MB, objspace_mem:53.88 MB
    parse json string to object
    43s sys_mem:360.47 MB, objspace_mem:322.96 MB
    46s sys_mem:360.54 MB, objspace_mem:322.96 MB
    50s sys_mem:360.54 MB, objspace_mem:322.96 MB
    53s sys_mem:360.54 MB, objspace_mem:322.96 MB
    56s sys_mem:360.54 MB, objspace_mem:322.96 MB
    1m  sys_mem:360.54 MB, objspace_mem:322.96 MB
    1m3s    sys_mem:360.54 MB, objspace_mem:322.96 MB
    1m7s    sys_mem:360.54 MB, objspace_mem:322.96 MB
    1m10s   sys_mem:360.54 MB, objspace_mem:322.96 MB
    set string&object to nil, and sleep 30 min to check the memory usage.
    1m13s   sys_mem:304.78 MB, objspace_mem:3.46 MB
    1m16s   sys_mem:304.78 MB, objspace_mem:3.46 MB
    1m19s   sys_mem:304.78 MB, objspace_mem:3.46 MB
    1m22s   sys_mem:304.78 MB, objspace_mem:3.46 MB
    

    几秒钟就释放干净了。你的启动参数是怎样的?

  • 统计的时候能不能跑一下 GC.stat,这样看不出来是哪里的内存。

  • 矩阵运算并不是 Python 语言的特性啊。。。主要是 Ruby 在这类语法糖的问题上处理非常宽松,经常一个方法一堆 alias,这 Python 吧。。。

  • 突然就明白我为什么通过不了 Ruby Certificate 考试了

    • 为什么函数式命令 reduce 被 Python 3 移到 functools,迫使每次使用的时候都要 import 一下呢?
    • 因为 Guido 不喜欢