Skip to content

Fix large matrix#148

Merged
YoheiKakiuchi merged 2 commits into
jsk-ros-pkg:masterfrom
YoheiKakiuchi:fix_large_matrix
Sep 26, 2015
Merged

Fix large matrix#148
YoheiKakiuchi merged 2 commits into
jsk-ros-pkg:masterfrom
YoheiKakiuchi:fix_large_matrix

Conversation

@YoheiKakiuchi

Copy link
Copy Markdown
Member

euslisp/EusLisp#139 にも関係するんですが、
verticesをN行3列 行列にしているんですが、Nが大きくなるとロード時間が
Nx3要素のfloat-vectorに比べて大幅に時間がかかることがわかりました。
なのでベクトルを読んでから行列に入れています。
これでjaxon_redのロード時間が半分くらいになります。

YoheiKakiuchi added a commit that referenced this pull request Sep 26, 2015
@YoheiKakiuchi YoheiKakiuchi merged commit c61c0b8 into jsk-ros-pkg:master Sep 26, 2015
@YoheiKakiuchi YoheiKakiuchi deleted the fix_large_matrix branch September 26, 2015 07:20
@k-okada

k-okada commented Sep 28, 2015

Copy link
Copy Markdown
Member

On Sat, Sep 26, 2015 at 3:47 PM, Yohei Kakiuchi notifications@github.com
wrote:

verticesをN行3列 行列にしているんですが、Nが大きくなるとロード時間が
Nx3要素のfloat-vectorに比べて大幅に時間がかかることがわかりました。
なのでベクトルを読んでから行列に入れています。

であれば,リーダで治せませんか?

◉ Kei Okada

@YoheiKakiuchi

Copy link
Copy Markdown
Member Author

リーダー見ているところですが、遅いのはリード自体ではなくて、その後のmatrixをつくるところですね。
ちゃんとプロファイルしてないですが、カンでみると、fill-initial-contentsの (elt seq i) が遅そうですね。
https://github.com/euslisp/EusLisp/blob/master/lisp/l/array.l#L71
seq (この場合は、行列の#2fを除いたリストのリスト)が入っていて、
長いリストのeltは遅いので。

@garaemon

garaemon commented Oct 1, 2015

Copy link
Copy Markdown
Member

memsetがあれば良いということでしょうか?

@YoheiKakiuchi

Copy link
Copy Markdown
Member Author

memsetがあれば良いということでしょうか?

#2f( (0 0 ... ) ... ) ) をリードするときに、 ( (0 0 ... ) ... ) ) としてリードしている[1]ので、
flattenしてベクトルにして(dolistができれば速度は同じくらいかも)という処理が必要かなと思います。

[1]のリストのリード部分を専用に作り変えるのは、そこそこ大事業な気がします。

@garaemon

garaemon commented Oct 1, 2015

Copy link
Copy Markdown
Member

なるほど、リストのeltが遅いんですね。
巧みにcar/cdrを駆使すれば出来そうな気もしますが

@k-okada

k-okada commented Mar 28, 2017

Copy link
Copy Markdown
Member

@YoheiKakiuchi

make-matrix 2 2 '(#f(1 2) #f(3 4))

でも遅いのかな.
https://github.com/euslisp/EusLisp/blob/EusLisp-9.23/lisp/l/array.l#L124

@YoheiKakiuchi

Copy link
Copy Markdown
Member Author

#2f(...) がこのPRの前の方法(方法1)
fvector-replace がこのPRの方法(方法2)
make-matrix N 3 '(#f(....make-matrix 2 2 '(#f(1 2) #f(3 4)) この方法です。(方法3)

N = 100,1000,3000,10000,30000,100000 で時間を調べました。
1000以下だと方法2が遅いです。それより大きくなると逆転してもっとも小さいのが方法2です。
方法1と方法3はN^2のオーダー(方法3はもっと悪いかも)で方法2はNのオーダーのように見えます。

結論としては、大きいオーダーでは有効で、小さいオーダーではそもそも差が小さいので現状の方法2が良いように思います。

Time for creating matrix [second]

method / matrix size 100 1000 3000 10000 30000 100000
#2f(...) 0.000194 0.006028 0.017283 0.096926 0.803124 8.70069
fvector-replace 0.004523 0.004375 0.005983 0.011543 0.026517 0.08314
make-matrix N 3 '(#f(.... 0.000267 0.002115 0.011014 0.091801 0.795989 15.8223

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants