ã¯ããã«
ãã®è¨äºã§ã¯ãRuby/Railsã®ã¡ã¢å ããã³ãºãªã³ã§ç¢ºèªãã¾ãã
ãã¡ã¢åãããã¨å é¨ã§ä½ãèµ·ããã®ãï¼ãã¨ããçåã«å¯¾ãã¦ãä½ã¬ã¤ã¤ï¼åç §ã»å²ãå½ã¦ã»GCï¼ã®è¦ç¹ã§æãåããã¦ç¢ºããã¾ãã
èæ¯ã»åæ©
Rails ã§ I/Oï¼DB/HTTPï¼ãä¼´ãå¦çã«ã¡ã¢åãå¹ãã®ã¯ç´æçã«åããã¾ããåãçµæãåå©ç¨ã§ããã°ãDB ã¸ã®è¤æ°åã¢ã¯ã»ã¹ãé¿ããããããã§ãã
䏿¹ã§ãI/O ããªãç´è¨ç®ã§ããæ¯åæ°ãããªãã¸ã§ã¯ãã確ä¿âç ´æ£ï¼GCï¼ããç¹°ãè¿ãã¨ãå²ãå½ã¦åæ°ã GC è² è·ãå¢ãã¦é ããªãã¾ãã
å é¨ã§ä½ãèµ·ãã¦ããã®ããå ·ä½çã«çè§£ãããããä»åã®è¨äºãæ¸ãã¾ããã
ããã§ã¯ãæãåããã¦ç¢ºèªãã¦ããã¾ãã
å®ä¾ã»ãã£ã¦ã¿ããã¨
ãµã³ãã«ã³ã¼ããæ¸ãã¦ã3ã¤ã®è¦³ç¹ãã確èªãã¾ãã
- åãåç §ãï¼: Object_id
- å²ãå½ã¦åæ°ï¼GC
- é度ï¼Benchmark
ãµã³ãã«ã³ã¼ãã¯ä»¥ä¸ã«ãªãã¾ãã
require 'benchmark' def build_obj # I/Oã®ä»£ããã«ã確ä¿ãã¡ãã£ã¨éããå¦çãæ¨¡æ¬ Array.new(10_000) { rand }.sum "x" * 10_000 end def no_memo build_obj end def memorized @memo ||= build_obj end puts "=== object_id ===" 3.times { p [:no_memo, no_memo.object_id] } 3.times { p [:memo, memorized.object_id] } puts "=== allocations (GC.stat) ===" GC.start before = GC.stat(:total_allocated_objects) 1000.times { no_memo } after = GC.stat(:total_allocated_objects) puts "no_memo allocations: #{after - before}" GC.start before = GC.stat[:total_allocated_objects] 1000.times { memorized } after = GC.stat[:total_allocated_objects] puts "memorized allocations: #{after - before}" puts "=== speed (Benchmark.bm) ===" Benchmark.bm do |x| x.report("no_memo x10000") { 10_000.times { no_memo } } x.report("memorized x10000"){ 10_000.times { memoized } } end
çµæã¯ä»¥ä¸ã®ããã«ãªãã¾ããã
=== object_id === [:no_memo, 60] [:no_memo, 80] [:no_memo, 100] [:memo, 120] [:memo, 120] [:memo, 120] === allocations (GC.stat) === no_memo allocations: 2002 memorized allocations: 2 === speed (Benchmark.bm) === user system total real no_memo x10000 4.498254 0.085579 4.583833 ( 4.584453) memorized x10000 0.000541 0.000005 0.000546 ( 0.000545)
çµæããããããã¨
- object_id:
- no_memoã¯æ¯åç°ãªããï¼æ¯åæ°è¦ã«å²ãå½ã¦ãããã¦ããï¼
- memorizedã¯æ¯ååããï¼æåã«å²ãå½ã¦ãããåç §ãç¹°ãè¿ãã¦ããï¼
- GC:
- memorizedã®allocations(å²ãå½ã¦åæ°)ãå§åçã«å°ãªãã
- Benchmark:
- memoirzed ã®æ¹ãéãï¼å²ãå½ã¦ã¨GCãæ¸ãããï¼
å¦ã³ã»æ°ä»ã
- ã¡ã¢åã®æ¬è³ªã¯ããåãåç
§ãè¿ãããã¨ã«ãã£ã¦ãå²ãå½ã¦åæ¸ãGCè² è·ãæ¸ãããã¨ã
- ã¡ã¢ãªæ¶è²»ãã¼ãã«ã¯ãªããªã (1ã¤ã¯å¿ ãå¿ è¦)
- I/Oããªãã¦ãã广ããããéãè¨ç®ï¼è¤éãã¸ãã¯ï¼ã大ããªãªãã¸ã§ã¯ããããã®ãªããã¡ã¢åã§æ¹åã§ããã
ã¾ã¨ã
- ã¡ã¢åãã â æåã«ç¢ºä¿âåç §ãä¿æâ以éã¯åãåç §ãè¿ã
- ã¡ã¢åãªã â æ¯å確ä¿â使ãçµããã¯GC
- 广ï¼å²ãå½ã¦åæ°ã¨GCæéã®åæ¸ â ã¹ã«ã¼ãããåä¸ã»CPUç¯ç´
ã¨ããããã¡ã¢åããã°è¯ãã¨æã£ã¦ãã¾ããããå é¨ãã©ã®ããã«åä½ãã¦ãããã調ã¹ããã¨ã§ããªãã¡ã¢åãå¿ è¦ãªã®ããçè§£ããä¸ã§ãå¦çãæ¸ããã¨ãã§ããããã«ãªã£ãããªã¨æãã¾ãã
ç¨èªã¡ã¢
- I/Oï¼å¤é¨ã¨ã®ããåãï¼DBã»ãã¡ã¤ã«ã»ãããã¯ã¼ã¯ãªã©ï¼
- GCï¼Garbage Collectionï¼ï¼ä¸è¦ã«ãªã£ããªãã¸ã§ã¯ããèªåååããä»çµã¿
- allocationsï¼å²ãå½ã¦åæ°ï¼ï¼æ°ãããªãã¸ã§ã¯ããä½ã£ãåæ°ï¼åºéå·®åã§è¦ãï¼
- benchmarkï¼æ§è½è¨æ¸¬ãBenchmark.bm ã benchmark-ips ã使ã㨠æéï¼ã¹ã«ã¼ããããæ¸¬ãã