Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
BigInt あれこれ / overview about BigInt
Search
shimataro
April 27, 2018
Technology
990
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
BigInt あれこれ / overview about BigInt
Node学園 30時限目の発表資料です
https://nodejs.connpass.com/event/83639/
shimataro
April 27, 2018
More Decks by shimataro
See All by shimataro
作って理解するPromise / Let's try implementing Promise
shimataro
0
55
Single Executable Applicationsについて / About Single Executable Applications
shimataro
0
2.1k
パッケージ開発者の苦悩 -JavaScriptランタイム群雄割拠- / distress of package developer
shimataro
0
860
An introduction to Node.js
shimataro
0
330
KFDのススメ / About KFD
shimataro
3
870
Node.js v12のES Modules / ES Modules on NodeJS v12
shimataro
1
1.2k
おまいらちゃんとリソース解放してますか / Remember to close resources!
shimataro
2
1.3k
CJSとESMとnpmパッケージ / CommonJS and ES Modules and npm package
shimataro
0
850
dynamic import あれこれ / dynamic import - overview and pitfalls
shimataro
1
890
Other Decks in Technology
See All in Technology
[しろおび夏祭り2026] チャットするAIから、作業するAIへ - 使われ方の変化と、その裏側で起きていること
kk0n
0
1.7k
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
780
AI駆動開発は個人技からチーム戦へ:組織でAIを使いこなすための実践設計
moongift
PRO
0
480
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
ボトムアップ文化が強い組織で セキュリティをどう根付かせていくかの現在進行形の話 / Making Security Stick in a Bottom-Up Organization
yamaguchitk333
0
210
Cursor Meetup Sapporo - Cursor物語 続編
cocacola917
0
140
OSPN.JPバージョンアップ作業進捗のご報告 / 20260801-osc26kyoto
akkiesoft
0
420
AWS ネットワーク構築でハマった(ハマりかけた) 5選とそこから得た教訓
nagisa53
4
200
Software Supply Chain Attackからクラウド環境を守るためにできること
lhazy
2
220
【CEDEC2026】『Relink』を拡張せよ - 『GRANBLUE FANTASY: Relink - Endless Ragnarok』の開発速度と品質を守るCI運用
cygames
PRO
0
140
オートロックマンションなのに、各部屋は施錠なし!? 攻撃者が組織内ネットワークで大暴れする理由 / The Front Door Is Locked, but the Rooms Are Wide Open: Why Attackers Move Freely Inside Enterprise Networks
nttcom
1
1.6k
つくって納得、つかって実感! 大規模言語モデルことはじめ ver2.0
recruitengineers
PRO
4
1.2k
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Technical Leadership for Architectural Decision Making
baasie
3
470
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
RailsConf 2023
tenderlove
30
1.5k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
630
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Mind Mapping
helmedeiros
PRO
1
300
Building Applications with DynamoDB
mza
96
7.2k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Between Models and Reality
mayunak
4
390
WENDY [Excerpt]
tessaabrams
11
39k
Transcript
BIGINT あれこれ BIGINT あれこれ (2018/04/27) (2018/04/27) 小田島 太郎 / @shimataro
NODE学園 30時限目 NODE学園 30時限目
自己紹介 自己紹介 ウェブリオ株式会社所属(京都) サーバサイドエンジニア 趣味は手品 前回も参加しました: 小田島 太郎 shimataro@GitHub odashima.taro@Facebook
shimataro999@Twitter dynamic import あれこれ
この発表について この発表について 対象: Number型じゃ物足りない人 技術レベル: 初級〜中級 ↓スライドはこちら↓ https://speakerdeck.com/shimataro https://shimataro.github.io/slides/
目次 目次 背景 さっそく使ってみる 速度検証 Numberとの速度比較 本番環境で使うには? まとめ
始める前に 始める前に
【慶】NODE学園 30回【祝】 【慶】NODE学園 30回【祝】 今後も盛り上げていきましょう!
【慶】4/25 NODE.JS V10リリース【賀】 【慶】4/25 NODE.JS V10リリース【賀】
【拝】4/20 関西NODE学園 開校【賀】 【拝】4/20 関西NODE学園 開校【賀】 お互い盛り上げていきましょう!
それでは始めます それでは始めます
背景 背景
背景 背景 Number型 64bit(ただし 整数部は53bitまで ) 9007199254740991 (約9千兆)が限界 もっと大きな整数を扱いたい! 全世界の負債総額は
2京円以上 だってさ TwitterのIDも53bitでは表現しきれない 時代は64bit DBにも64bit整数とかあるよね
背景 背景 BigInt 登場! 現在はStage3 Node v10 でサポート ただし --harmony-bigint
が必要 64bitではなく 任意精度 https://tc39.github.io/proposal-bigint/
さっそく使ってみる さっそく使ってみる
さっそく使ってみる さっそく使ってみる まずはビルド 正式リリースされたから公式ページからインストール! $ git clone --depth 1 https://github.com/nodejs/node.git
$ cd node $ ./configure $ make -j4 # 並列ジョブ数はCPUのコア数に合わせる $ ./node -v # バージョン確認! v10.0.0-pre https://nodejs.org/
さっそく使ってみる さっそく使ってみる BigIntの生成 100n, 0x100n BigInt(100), BigInt("100"), BigInt("0x100") 型変換: Number(100n),
100n.toString() 小数点以下は切り捨てられる: (1n / 2n) === 0n Number型との共演はNG ビットシフトすら 1n << 10n と書く 文字列結合は "a" + 1n でOK
速度検証 速度検証
速度検証 速度検証 現在最大の (2^77232917 - 1) 超速い! メルセンヌ素数 $ time
node --harmony-bigint -e "2n ** 77232917n - 1n" real 0m0.110s ←0.11秒!! user 0m0.094s sys 0m0.016s
速度検証 速度検証 底を変えてみる $ time node --harmony-bigint -e "3n **
77232917n - 1n" real 124m47.252s ←2時間!? user 124m43.277s sys 0m0.260s $ time node --harmony-bigint -e "4n ** 77232917n - 1n" real 0m0.161s ←0.16秒! user 0m0.132s sys 0m0.029s
速度検証 速度検証 10進文字列に変換してみる 16進文字列に変換してみる $ time node --harmony-bigint -e "(2n
** 77232917n - 1n).toString( real 473m33.712s ←8時間!! user 473m32.767s sys 0m0.208s $ time node --harmony-bigint -e "(2n ** 77232917n - 1n).toString( real 0m0.165s ←0.16秒! user 0m0.125s sys 0m0.040s
速度検証 速度検証 結果 2進数で簡単に計算できるものは速い 2の累乗、4の累乗 16進文字列への変換 逆に、2進数で時間がかかるものは遅い 3の累乗 10進文字列への変換 考察:
内部的には2進数ベースで計算している? (考察じゃなくてソース読めよ…)
NUMBER型との速度比較 NUMBER型との速度比較
NUMBER型との速度比較 NUMBER型との速度比較 雑なベンチマーク let i, j, k, val; for(i =
1; i <= 100; i++) { for(j = 1; j <= 100; j++) { for(k = 1; k <= 100; k++) { for(l = 1; l <= 100; l++) { val = i; val += j; val *= k; val %= l; } } } }
NUMBER型との速度比較 NUMBER型との速度比較 Number BigInt(数値に n を追加) Number型で収まる範囲の演算でも、BigIntだと遅い ⇒Numberを使えるなら使ったほうがいい real 0m0.381s
←0.38秒 user 0m0.352s sys 0m0.029s real 0m22.087s ←22秒! user 0m24.116s sys 0m0.355s
本番環境で使うには? 本番環境で使うには?
本番環境で使うには? 本番環境で使うには? 本番環境ではLTSを使いたい 10月まで待つ? 本番環境は --harmony とかあまり使いたくない v12まで待つ? v12のLTSリリースは来年の10月? 待ってられん!
本番環境で使うには? 本番環境で使うには? Babelはどうよ https://babeljs.io/blog/2017/09/12/planning-for- 7.0#stage-3-bigint-new-un nished
本番環境で使うには? 本番環境で使うには? 多分こういうこと ↓バベるとこうなる(多分)↓ 全部の演算子を置き換えなきゃアカン a += b; // a,
bがBigInt型かどうかわからない class BigInt { ... } // ラップ用のクラス if (typeof a === "BigInt") { a = a.plus(b); } else { a += b; }
本番環境で使うには? 本番環境で使うには? 今はまだ big-integer パッケージを使おう 10進数ベースの演算 10000000 単位でパックしている 意外と速い $
npm i -S big-integer const BigInteger = require("big-integer"); // "150" const strValue = BigInteger(100) .plus(50) .toString();
まとめ まとめ Node v10で BigInt に対応したよ ただし --harmony-bigint が必要だよ 2進表現で高速に計算できるものは速いよ
Numberよりはかなり遅いよ 現時点では big-integer を使おう 関西Node学園もよろしく! 登壇者大募集! 手品に興味があったら声をかけてね!
ありがとうございました ありがとうございました
おまけ おまけ ここまで見てくれてありがとう( *´艸`)
BIGINT VS BIG-INTEGER 2番勝負 BIGINT VS BIG-INTEGER 2番勝負
ROUND 1: 雑ベンチ再び ROUND 1: 雑ベンチ再び big-integer版 const BigInteger =
require("big-integer"); let i, j, k, val; for(i = 1; i <= 100; i++) { for(j = 1; j <= 100; j++) { for(k = 1; k <= 100; k++) { for(l = 1; l <= 100; l++) { val = BigInteger(i); val = val.plus(j); val = val.multiply(k); val = val.mod(l); } } } }
ROUND 1: 雑ベンチ再び ROUND 1: 雑ベンチ再び 計測結果 BigIntの結果(再掲) BigIntより速くね? 実は、big-integerはNumberに収まる範囲の演算はその
まま計算するので速い real 0m7.587s user 0m8.001s sys 0m0.362s real 0m22.087s user 0m24.116s sys 0m0.355s
ROUND 2: 場外乱闘 ROUND 2: 場外乱闘 …というわけで、Number型の範囲外でもう一度挑戦して みます。
ROUND 2: 場外乱闘 ROUND 2: 場外乱闘 big-integer版 const BigInteger =
require("big-integer"); let i, j, k, val; for(i = 1; i <= 100; i++) { for(j = 1; j <= 100; j++) { for(k = 1; k <= 100; k++) { for(l = 1; l <= 100; l++) { val = BigInteger(Number.MAX_SAFE_INTEGER).plus(i) val = val.plus(j); val = val.multiply(k); val = val.mod(l); } } } } real 0m41.659s user 0m42.663s sys 0m0.932s
ROUND 2: 場外乱闘 ROUND 2: 場外乱闘 BigInt版 let i, j,
k, val; for(i = 1n; i <= 100n; i++) { for(j = 1n; j <= 100n; j++) { for(k = 1n; k <= 100n; k++) { for(l = 1n; l <= 100n; l++) { val = BigInt(Number.MAX_SAFE_INTEGER) + i; val += j; val *= k; val %= l; } } } } real 0m30.764s user 0m33.004s sys 0m0.343s
ROUND 2: 場外乱闘 ROUND 2: 場外乱闘 BigIntのほうが1.3倍速かった 変換と加算が増えてBigIntさんも遅くなったけどね
結論 結論 Numberに収まるときもある場合はbig-integerも検討の 価値あり 収まらないことが明確な場合はBigIntのほうがいい
None