Tuesday, February 18, 2014

Re: magnum.vim - Pure Vim script big integer library

Feedback about the plugin:
============================================
+ written nicely (api, code, ..), with test suite ! (great)

+ works correctly (I've run maybe 2400 additional tests, 200 random runs
for each method)
(generating the test cases takes about 0.02 secs, running them takes
about 6 secs (core-i5)
(Code generating test code : http://dpaste.com/1634959/)

+ unique selling point (base conversions possible) could be emphasized in README
This could also be of interest to other plugin writers.

- false statement ? (found in wiki):

=========== claim:
Given some UNIX timestamps, determine the average. This is something you can't do with Vim numbers.

let times = [
\ 1390938148,
\ 1390759759,
\ 1391028429,
\ 1390992724,
\ 1391100465,
\ ]
[...]
===============

Why can't I do this with vim?
Sample implementation (fun! Average) in benchmark below: [1 little benchmark]
(I agree it requires float support in Vim)

Anyway: benchmark for such use case (1000 and 10000 files), done on a core-i5:

" 1000 numbers : 22ms
" 10000 numbers: 221ms
echo tlib#cmd#Time('call Test1()')
" 1000 numbers : 0ms
" 10000 numbers: 3ms
echo tlib#cmd#Time('call Test2()')

Why am I asking about why it was written ?
============================================
If there are strong arguments for adding it I'd like to add it to the list of
things to improve about Vim.

Marc Weber

=== [1 little benchmark]
looks like its still quite fast

fun! Average(list)
" vim does have float support !
let avg = 0.0
for i in a:list
let avg += i
endfor
return avg / len(a:list)
endf

let num = 1390938148
let s:times = []
for i in range(0,10000)
call add(s:times, num)
endfor

" cannot use it inside a function !??
let s:zero = magnum#ZERO

fun! Test1()
call magnum#Int(2)
let sum = s:zero
for time in s:times
let sum = sum.Add(magnum#Int(time))
endfor
let tally = magnum#Int(len(s:times))
let s:average_1 = sum.Div(tally).Number()
endf

fun! Test2()
let s:average_2 = split(printf('%f', round(Average(s:times))), '\.')[0]
endf

" 1000 numbers : 22ms
" 10000 numbers: 221ms
echo tlib#cmd#Time('call Test1()')
" 1000 numbers : 0ms
" 10000 numbers: 3ms
echo tlib#cmd#Time('call Test2()')

echo "expected result: ".num
echo 'magnum result '.s:average_1
echo 'float result '.s:average_2

--
--
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/groups/opt_out.

No comments: