Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
BigInt あれこれ / overview about BigInt
Search
shimataro
April 27, 2018
Technology
1k
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
65
Single Executable Applicationsについて / About Single Executable Applications
shimataro
0
2.1k
パッケージ開発者の苦悩 -JavaScriptランタイム群雄割拠- / distress of package developer
shimataro
0
900
An introduction to Node.js
shimataro
0
330
KFDのススメ / About KFD
shimataro
3
880
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
860
dynamic import あれこれ / dynamic import - overview and pitfalls
shimataro
1
900
Other Decks in Technology
See All in Technology
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
3
770
12 個 Tool と、 4,096 Token
hlum
0
150
Getting Started with Google Antigravity
glaforge
0
230
Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
150
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
0
150
「事実」を「計測」して、「解釈」する 〜AWS Lambdaのメモリ最適解の見つけ方〜
maimyyym
0
140
サブエージェントと Claude Mods で作る独自 Advisor ツールの話
kenichiodo
1
100
分析AIエージェントを育てる、動く環境を育てる
codatum
1
1k
AgentCoreで実践するハーネスエンジニアリング
yakumo
1
300
AI駆動開発の時代になったのでトヨタ生産方式から見直す
terurou
7
5.9k
[AWS 秋のクラウドオペレーション祭り 2026]AWS DevOps Agentで変わるリリースと運用対応 ~リリース管理機能と Directed actions のご紹介~
furuton
4
1.2k
Classmethod Company Deck
satoshi7
0
140
Featured
See All Featured
Claude Code のすすめ
schroneko
67
230k
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
710
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
600
So, you think you're a good person
axbom
PRO
2
2.2k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
450
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