Ramel Eshed <rame...@gmail.com> wrote:

> My problem is not with the channel, the problem is
> that system() is slower than the equivalent job_start().
> You can run and compare the results of Job() and System()
> functions in the attached file. They are both doing the same
> thing ('echo aaa') but System() is ~5 times slower than Job()
> on Ubuntu and x10 slower on RHEL5.5. On RHEL
> System() is extremely slow, it takes about 0.2 seconds
> which cause Vim to hang.

I just tried the script system.vim which you attached
and measured x3 times on my laptop x86_64
(xubuntu-14.04) using Vim-7.4.2290:

:so system.vim

:call Job()
aaa:   0.004798
:call Job()
aaa:   0.002810
call Job()
aaa:   0.002988

:call System()
aaa:   0.007809
:call System()
aaa:   0.007768
:call System()
aaa:   0.007858

So for me, System() is also slower than Job().
However, the difference on my machine is not
as large as yours.  I don't see system()
taking 0.2 sec as you see on RHEL.

I tried this with strace:

$ strace -r -f -osystem.trace time ./vim -u NONE -N -S system.vim  -c
'call System()|q'
$ strace -r -f -ojob.trace time ./vim -u NONE -N -S system.vim  -c
'call Job()|q'

Looking at log files jobs.trace and system.trace,
I saw that:

In system.trace

8756  execve("/bin/bash", ["/bin/bash", "-c", "(echo aaa)
>/tmp/vwA2O35/0 2>&1"], [/* 69 vars */] <unfinished ...>

In job.trace:

8773  execve("/bin/sh", ["/bin/sh", "-c", "echo aaa"], [/* 72 vars */]
<unfinished ...>

Ah, it's not using the same shell! /bin/sh is a symlink
to /bin/dash on my system, which is a simpler shell
than /bin/bash.   system() also runs the command in a
subshell which may make it slower.

I then added this line in your script system.vim:

set shell=/bin/sh

And now system() is faster, still not as fast as Job() but
getting closer:

:call System()
aaa:   0.004737
:call System()
aaa:   0.004920
:call System()
aaa:   0.004718

What is the value of :echo &shell  for you?
Can you try with set shell=/bin/sh ?

Here is my modified system.vim:

===
$ cat system.vim

set shell=/bin/sh
func! Job()
    let g:output = []
    let s:rt = reltime()
    let g:job = job_start(['/bin/sh', '-c', 'echo aaa'], {'out_cb':
function('s:out_cb'), 'close_cb': function('s:close_cb')})
endfunc

func! s:out_cb(channel, msg)
    call add(g:output, a:msg)
endfunc

func! s:close_cb(channel)
    echo g:output[0] . ': ' . reltimestr(reltime(s:rt))
endfunc

" compare with:

func! System()
    let s:rt = reltime()
    let g:output = systemlist('echo aaa')
    echo g:output[0] . ': ' . reltimestr(reltime(s:rt))
endfunc
===

Regards
Dominique

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui