Entirely agree with your VimL principle : less command is fast/better, inner system apis... Principle that works for any Language.
Out the fact that it is not here a xml treenode parser but inlines binary file modifications, do you think modifying large xml file (1Million line 40Mo) can be as fast as libxml (ox ruby, python) or xpath parser ?
2018-02-14 9:20 GMT+01:00 Nikolay Aleksandrovich Pavlov <zyx.vim@gmail.com>:
Using registers here makes no sense, you can just use variables. `\=`2018-02-14 10:41 GMT+03:00 Ni Va <nivaemail@gmail.com>:
> Le mardi 13 février 2018 14:30:38 UTC+1, Luc Hermitte a écrit :
>> Hello Nicholas,
>>
>> > After reading a file and getting 1 million lines' List, I need to
>> > make similar substitutions over matched lines ~500 times with this
>> > func:
>> >
>> >
>> > fun! foo#set_new_val(ressource) abort "{{{
>> >
>> > " position
>> > let pos = foo#getpos_ress(a:ressource)
>> > let pres = foo#geth_presence(a:ressource)
>> > let s:xml[pos] = substitute(s:xml[pos],'false\|true',pres,"") <<<
>> > HERE
>> >
>> > " Slave/Voie01 to Voie08
>> > for idx in [1,2,3,4,5,6,7,8] <<< HERE
>> > let pos = foo#getpos_ress(a:ressource.'/bar0'.string(idx))
>> > let s:xml[pos] = substitute(s:xml[pos],'false\|true',pres,"") <<<
>> > HERE
>> > endfor
>> >
>> > endfu"}}}
>> >
>> >
>> > 1/ Can I optimize this function ?
>>
>> So far my experiments on the subject taught me that we are best avoiding :for and :while constructs when performances matter.
>> If you can use map() instead, do!
>>
>> HTH,
>>
>> --
>> Luc Hermitte
>
> Yess Luc !
>
> I finally reached to the same conclusion.
>
> 1/ But mapping Dict or List, inside the substitute func is needed no ?
> 2/ Other point, passing by register with emmbedded pattern is it faster ?
>
> let @a = '\w\+\(<\/PRES\)'
> let @b = pres.'\1'
>
> call map(voies_no, 'substitute(s:xml[v:val],"\=@a","\=@b","")')
is not going to work like you typed here. For loop with preceding
substitute from original function look like they can be rewritten into
call map(
\[a:ressource] + map(range(1, 8), 'a:ressource."/bar0".v:val'),
\'extend(
\ s:xml, {
\ extend(l:, {"pos": foo#getpos_ress(v:val)}).pos
\ : substitute(s:xml[pos],''\c\vfalse|true'',pres,"")})')
Note that my main VimL optimization principle is "less commands is
better". "Avoid loops" is one of the special cases only: by "less
commands" I mean not "less commands in code", but "less commands to
execute". I used to write a `:while` loop which contained nothing, but
conditional expression and all the work was done there (`extend(l:,
{})`, list literals as a replacement for comma operator and no
optimizer messing with sequence points rock (until you need to debug
this mess)). Note that for this reason lambdas (with the current
implementation) are a no-go: they create functions with `return`
command. If you need optimization and you have a choice between lambda
and some kind of `eval()` (e.g. map string literal) then use `eval()`.
>
>
> Thanks you
>
> --
> --
> You received this message from the "vim_use" 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_use" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com .
> For more options, visit https://groups.google.com/d/optout .
--
--
You received this message from the "vim_use" 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 a topic in the Google Groups "vim_use" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/vim_use/dY1x4ok__7w/ .unsubscribe
To unsubscribe from this group and all its topics, send an email to vim_use+unsubscribe@googlegroups.com .
For more options, visit https://groups.google.com/d/optout .
--
You received this message from the "vim_use" 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_use" group.
To unsubscribe from this group and stop receiving emails from it, send an email to vim_use+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
No comments:
Post a Comment