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.