首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在红宝石中‘xclip .bashrc`’比系统(“xclip .bashrc")花费的时间要长得多?

为什么在红宝石中‘xclip .bashrc`’比系统(“xclip .bashrc")花费的时间要长得多?
EN

Stack Overflow用户
提问于 2013-10-08 01:25:35
回答 2查看 447关注 0票数 3
代码语言:javascript
复制
irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> puts Benchmark.measure { system "xclip .bashrc" }
  0.000000   0.000000   0.000000 (  0.008030)
=> nil
irb(main):003:0> puts Benchmark.measure { `xclip .bashrc` }
  0.000000   0.000000   0.000000 ( 33.215158)
=> nil
irb(main):004:0> RUBY_VERSION
=> "2.0.0"

我在互联网上读到了几乎所有关于从ruby脚本调用shell命令的各种方法的信息,但我不明白为什么Kernel#`Kernel#system花费的时间长得多。

更新

Kernel#`只对xclip来说要慢得多。所有其他命令几乎都需要相同的时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-08 16:54:22

我怀疑当您使用backticks进行外壳时,xclip只需要很长时间才能终止。这与选择有关。如果没有通过-sel提供的任何选择,它将默认为XA_PRIMARY,这通常用于通过鼠标中间按钮实现复制和粘贴。

当你跑的时候

代码语言:javascript
复制
$ xclip text.txt

内容可以通过XA_PRIMARY获得,这意味着您可以通过鼠标中间按钮或$ xclip -o粘贴内容。当您在Ruby中执行一个shell时,它会变得很奇怪:

代码语言:javascript
复制
ruby -e '`xclip text.txt`

如果你什么都不做,它永远不会终止。当您在X11系统中选择某些内容时,例如在控制台或其他任何地方,它都会终止。只要选择,用你的鼠标做标记。如果不这样做,它将在某个时候挂起和/或超时。

在使用详细模式时,可以观察到相同的行为:

代码语言:javascript
复制
$ xclip -verbose text.txt

Connected to X server.
Using UTF8_STRING.
Reading text.txt...
Waiting for selection requests, Control-C to quit
  Waiting for selection request number 1

当您选择某项内容时,将再次处理选择请求。

这方面的一个很好的分析工具是strace ( -f选项也用于跟踪叉)

代码语言:javascript
复制
$ strace -f ruby -e '`xclip text.txt`'

...
poll([{fd=3, events=POLLIN|POLLOUT}], 1, 4294967295) = 1 ([{fd=3, revents=POLLOUT}])
writev(3, [{"\20\0\3\0\4\0\200\2INCR", 12}, {NULL, 0}, {"", 0}], 3) = 12
poll([{fd=3, events=POLLIN}], 1, 4294967295) = 1 ([{fd=3, revents=POLLIN}])
recvfrom(3, "\1\0\f\0\0\0\0\0\235\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 4096,                                                                      0, NULL, NULL) = 32
recvfrom(3, 0x165e964, 4096, 0, 0, 0)   = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(3, 0x165e964, 4096, 0, 0, 0)   = -1 EAGAIN (Resource temporarily unavailable)
poll([{fd=3, events=POLLIN}], 1, 4294967295

在最后一行中,它挂起,直到做出选择。poll()用于在文件描述符处等待文件事件。它会在某个时候终止,但4,294,967,295毫秒相当长。仅用strace -f xclip text.txt就可以追踪到这一点。

您可以通过ls -l /proc/PID/fd查看文件描述符。数字3的文件描述符是xclip等待所选内容的文件描述符。

让调试变得如此困难的是,if立即在strace xclip text.txt中终止,而不是在strace -f text.txt中终止。当你想要追踪叉子的时候,它就不再起作用了。这和Ruby的问题是一样的。它试图跟踪输出,因为Kernel#`希望返回输出。这可能也与票证#9在从stdin设置剪贴板时不关闭stdout有关。

这是我的理论。当您执行并希望跟踪xclip的输出时,无论是使用Ruby,还是使用strace来跟踪分叉,标准输出在做出选择之前都不会关闭。

这并不能很好地解释它,但它证明了这一点,即不需要对Ruby做任何事情。我将创建一个仅关注于xclip的问题,而不是在Ruby的上下文中。

票数 3
EN

Stack Overflow用户

发布于 2013-10-08 01:41:05

您需要提供更多的细节,关于您正在使用xclip做什么。B/c (因为)我的ruby 1.9.3使用"echo hello“显示最小的差异。

代码语言:javascript
复制
$ irb
irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> puts Benchmark.measure {  `echo hello` }
  0.000000   0.000000   0.000000 (  0.001471)
=> nil
irb(main):003:0> puts Benchmark.measure { system "echo hello" }
hello
  0.000000   0.000000   0.000000 (  0.001598)
=> nil
irb(main):004:0> RUBY_VERSION
=> "1.9.3"
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19237559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档