• 《Ruby原理剖析》里面介绍过,each 方法每次迭代都准备一大波对象,执行很多逻辑。而while只需要调整PC指针的值,性能不在一个量级。 具体的细节我得回去翻翻书了。

  • 用 Docker 构建开发环境 at 2018年10月16日

    把第五步how to use 整理成一个脚本,在Dockerfile中用ENTRYPOINT/CMD触发, 再加上一个平滑替换容器的脚本, 就完美了。

  • Z-Score ML里面做数据特征归一化,数学真是无处不在

  • 关于一些基础的语法问题 at 2018年10月10日
    command :add do |c|
      c.action do |global_options,options,args|
        $todo_list.create(args)
      end
    end
    

    等价于:

    command(:add) do |c|
      c.action do |global_options,options,args|
        $todo_list.create(args)
      end
    end
    

    command(:add) 会返回一个方法,后面的代码块是这个方法的"参数"。

  • 你nginx代理静态资源写的是这个:

    location ~*^/app/assets/{
    
    }
    
    

    有这个路径吗?换下下面这个试试:

    location ^~ /assets/{
    
    }
    

    顺便建议在 config/environments/production.rb 加上:

    config.serve_static_files = false # 不让后端处理静态资源请求,可以检测你nginx是否真的代理的静态资源
    
  • 精靈旅社疯狂假期, 精灵旅社精靈旅社 在写入ES时,先全部转化为简体,只存一份。在查询时将所有的繁体转化为简体,再到ES查询,可行?

  • includes 的实现原理与困境 at 2018年08月18日

    实际情况复杂,关联对象取出来后,在渲染时还需要执行很多业务逻辑,而且对象关联可能不止一层。用pluck,可能会有局限而且改造成本高。

  • 技师这个词用的好😂

  • 不是基于统计的??? 楼主能不能大概描述一下核心原理 ? thx

  •   class T
        A = {a: 1, b: 3}
        def s
          {c: 1, d: 1}
        end
      end
    
      T::A.object_id
    => 70307759309580
      T::A.object_id
    => 70307759309580
    
      t = T.new
    => #<T:0x00007fe39ba59ea8>
      t.s.object_id
    => 70307772676380
      t.s.object_id
    => 70307766481000
    

    最好用配置文件,实在不行,从内存的角度来看,还是放在常量里好些。

  • includes 的实现原理与困境 at 2018年07月30日

    很好的思路。将用户权限、用户自定义配置、核心数据配置、顶层数据((支持实时多条件查询)、关联数据本身组合打包,一起生成多层cache_key,再增加层级间的touch机制,可以让这套机制跑起来。之前没有这么做,应该是因为缓存命中率和这一锅粥的复杂度,不过这个方案确实值得尝试。

  • includes 的实现原理与困境 at 2018年07月30日

    套娃更多的是提升渲染阶段的性能吧,在当前场景下需要做到很小的粒度才有意义,而且还是得先把数据查询出来,难以跳过includes带来的问题。

  • includes 的实现原理与困境 at 2018年07月30日

    确实,在准备融入项目时发现隐藏成本不小。特别是随着代码量增长,增加新的字段,新的方法时,特别容易埋下坑。这种功能需要写的尽量简洁,易配置,且只用在局部有性能痛点的地方。

  • 从 ActiveRecord 看乐观锁 at 2018年07月18日

    是的, 一般读多写少怎么玩都行。乐观锁就是因为无锁,吞吐量大些,单次响应快(可能成功,可能失败)。

  • Ruby GC 自述 at 2018年07月11日

    有时确实容易造成bug,我换一个例子:

    stringArray.each do |s|
      if s == 'someString'.freeze
          # do something
      end
    end
    
  • Ruby GC 自述 at 2018年07月09日

    环境永远不是完美的,或者说成本(时间/精力等)永远是有限的。我们需要做的事情,就是在这些限制下作出努力,让成本和收益达到某个平衡点。

    过分限制Ruby创建新对象会极大提升成本,得不偿失。大多数人建议少创建对象,本意是合理使用Ruby的特性,让它避免创建某些没有意义的临时对象。 例如下面两段代码:

    stringArray = stringArray.map do |s|
      s.upcase  # 会创建新的对象
    end  # 创建一个新的数组
    
    stringArray.each do |s|
      s.upcase!  # 不会创建新的对象
    end
    

    这些小细节本身微不足道,但是当这些代码被执行千百次时,它带来的整体收益还是可观的。

  • Ruby GC 自述 at 2018年07月09日

    感谢@nowherekai的提醒和推荐,已经修改正确了。

    用Ruby很多时候是追求开发效率和开发体验。当应用对内存很敏感,或者说内存消耗造成了明显的问题,而这个问题又是Ruby造成的,那么换一种工具(语言)是可以考虑的选择。

  • Ruby GC 自述 at 2018年07月09日

    语言本身和使用语言的方式,这两个方面可能都得做出一些努力吧。据说ActiveRecord在重构了,会创建更少的对象。

  • Ruby GC 自述 at 2018年07月09日

    嗯,少创建对象是最重要的。 文章本意主要是想介绍一下GC。

  • Ruby GC 自述 at 2018年07月09日

    感谢提醒,已经修改了。

  • Ruby GC 自述 at 2018年07月08日

    关于文章内容,请各路大神们提点建议,帮助这篇文章成为Ruby GC的扫盲资料,通过文章能对GC有基础的了解。 感谢!

  • 如果http请求本身会堵塞,那么重启后,此症状还不是会重现吗?

    进程/线程数开大,同时超时时间更短?

  • 从部署日志上看,你发送的是TERM信号,让进程先全部挂了,然后才重新启动。在进程挂掉到新的进程启动完成的过程中,你的服务肯定会有中断的。 给进程发送USR2信号,puma本身是支持平滑重启的,https://github.com/puma/puma/blob/master/docs/signals.md

  • 看了一下你的代码,创建Websockt连接去获取数据的操作,是在用户的http请求中被动触发的。 这里面数据和数据是打包耦合在一起的。你看能不能换一种实现方式,单独开几个线程来实现数据,让这两个过程分开。比如在BvHelper::Daemon.run方法中先创建几个线程去获取数据,然后才EventMachine.start_server:

    require 'eventmachine'
    
    module EchoServer
    
      def receive_data data
        puts data
        puts $data
      end
    
    end
    
    class Server
      def self.run
        3.times do |i|
          Thread.new do
            loop do
              $data ||= {}
              $data[i] = Time.now.to_i
              sleep 1
            end
          end
        end
    
        EventMachine.run {
          EventMachine.start_server "127.0.0.1", 8081, EchoServer
        }
      end
    end
    
    Server.run
    
  • 顶一个,有意思的问题。 把你的代码放出来?