哇,看到了 elixir
看了一遍实现,这个东西其实也没那个复杂,核心逻辑在
def parallelize(workers: 2, with: :processes)
workers = ENV["PARALLEL_WORKERS"].to_i if ENV["PARALLEL_WORKERS"]
return if workers <= 1
executor = case with
when :processes
Testing::Parallelization.new(workers)
when :threads
Minitest::Parallel::Executor.new(workers)
可以用thread
模式也可以用process
模式,thread 模式是Minitest
本来就有的,而 process 模式是自己撸的,
在自己搞的Testing::Parallelization
里面,主要跑测试的代码在这
@pool = @queue_size.times.map do |worker|
fork do
DRb.stop_service
after_fork(worker)
queue = DRbObject.new_with_uri(@url)
while job = queue.pop
klass = job[0]
method = job[1]
reporter = job[2]
result = Minitest.run_one_method(klass, method)
queue.record(reporter, result)
end
run_cleanup(worker)
end
end
每个 fork 出来的 process 都会创建一个类似于test-database-0
,test-database-1
这样的数据库(在after_fork_hook
里面被创建,在run_cleanup_hook
里面被drop
掉),每个进程都会从 Drb 服务器里面拿到一个放了 jobs 的 Queue(https://ruby-doc.org/core-2.5.0/Queue.html),然后运行它
Minitest.run_one_method(klass, method)
(job 是 klass, method, reporter 的封装)
这照片怎么有点糊?
非常优秀的视频,讲解的很清楚。Rails 把路由解析成了 NFA(顺便帮我简单过了一遍编译器知识),然而和我的问题关联不是很大啊
请教下为什么 sentry/newrelic 为什么很耗性能?
冒昧的问一些问题
谢谢
赞,感觉我的想法和你很相近啊。 专门写个轮子 bear markdown 解析转化成 html 很有意思。博客挺简洁漂亮,很喜欢。
好帖,发现自己需要看下 Nginx 了
仔细看了两遍,回答的很用心,信息量很大,感谢
我这按它的脚本,是这样的
ceclinux@ceclinux-pc ~/ruby 973 trunk ? time ./ruby --disable-gems --jit --jit-wait --jit-verbose=1 15a.rb ✔ 10248 18:46:44
JIT success (55.3ms): block in <main>@15a.rb:13 -> /tmp/_ruby_mjit_p2514u0.c
JIT success (183.4ms): [email protected]:1 -> /tmp/_ruby_mjit_p2514u1.c
{:result=>600}
Successful MJIT finish
./ruby --disable-gems --jit --jit-wait --jit-verbose=1 15a.rb 4.84s user 0.03s system 99% cpu 4.880 total
ceclinux@ceclinux-pc ~/ruby 972 trunk ? time ./ruby --disable-gems 15a.rb 1 ↵ 10250 18:47:17
{:result=>600}
./ruby --disable-gems 15a.rb 9.08s user 0.00s system 99% cpu 9.087 total
一倍差距算是很大了把?
整体行文略虚,尤其是反思问题部分。能在 RubyConf China 做分享称自己为技术达人我觉得没问题阿,没有必要太苛刻。
Fir 用了下,感觉挺难用的,谁能告诉我下它比irb
或者pry
好在哪,是我理解错了?
今天试了下Bootsnap
,开启速度毫无变化……
并不是,你试试
ruby -ve rsion
然后看看 -e 是干嘛的就知道了
……看的我目瞪口呆,我居然找不到一个切入点来喷你
老实说这种东西挺无聊的,有点像 Fixnum 和 Bignum,无聊的 implementation detail 一大堆,带来一些坑,可能还作为面试题目。然后 Ruby 2.4.0 就把 Fixnum 和 Bignum 合为 Integer 了。什么时候把 Float 和 BigDecimal 合二为一啊
总之,用 Float 做严格浮点数计算是不可靠的。如果要做精确使用浮点数计算,那就用 BigDecimal
试了下,确实如此
赞,看完 Ruby 元编程之后尝试看了点 activerecord,被各种方法调用来调用去的看晕了,估计功力还不够深把。最近正在看sinatra
的源码,感觉简单很多。
支持支持
另外 ruby 是有性能提升啊,不过任重而道远
贴下你在文章中提到的递归的 fib 在几个语言下的跑分供参考,CPU 是非满血版的 i5-8250U,机器是 4.9.76-1-MANJARO #1 SMP PREEMPT Wed Jan 10 20:17:16 UTC 2018 x86_64 GNU/Linux
ruby 2.3.3
•100% ➜ time ruby fib.rb
102334155
ruby fib.rb 11.28s user 0.01s system 99% cpu 11.303 total
ruby 2.5.0
•100% ➜ time ruby fib.rb
102334155
ruby fib.rb 9.56s user 0.01s system 99% cpu 9.570 total
crystal 0.24.1
•100% ➜ time crystal fib.rb
102334155
crystal fib.rb 1.70s user 0.10s system 106% cpu 1.681 total
go run
•100% ➜ time go run fib.go
102334155
go run fib.go 0.84s user 0.08s system 95% cpu 0.963 total
go build
•100% ➜ time ./fib
102334155
./fib 0.65s user 0.00s system 99% cpu 0.660 total
crystall 速度不错,而且直接可以拿 ruby 版本的代码跑,很爽
再来一个例子
class Test
p instance_methods(false)
def t
end
p instance_methods(false)
alias :new_t :t
p instance_methods(false)
end
原因在于,ActiveRecord
方法是动态加载的,它自己加上了很多元编程的东西,其实在你运行alias :real_avatar :avatar
的时候,还不存在avatar
这个实例方法,不信你试试看
class User < ApplicationRecord
p instance_methods(false)
alias :real_avatar :avatar
def avatar
real_avatar.present? ? "real_avatar" : "default.png"
end
end
你看 Ruby 元编程的话,建议用原生 Ruby 来尝试例子,后面它会讲到 Rails 里面的元编程,你心里就有数了
google rails test database connection
nil.class #NilClass
nil[] #NoMethodError: undefined method `[]' for nil:NilClass
居然沒有人,我先支持一下,希望能坚持做下去
不是每一版都有性能提升吗……
直接
self.size <=> param.size
吧
这个几句话说不清,你可以看 Ruby 元编程,后面专门有一章讲 ActiveRecord::Base
google 'ruby double colons'