Mercurial > hg > Members > anatofuz > slides
comparison slides/2018/07/17/slide.md @ 52:73b27e5c1d79 default tip
auto-Update generated slides by script
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 16 Apr 2019 18:58:24 +0900 |
parents | 49a9086fc7e9 |
children |
comparison
equal
deleted
inserted
replaced
51:5f949b153f65 | 52:73b27e5c1d79 |
---|---|
1 title: CbCによるMoarVMの改良 | |
2 author: Takahiro Shimizu | |
3 profile: | |
4 lang: Japanese | |
5 | |
6 | |
7 # 研究目的 | |
8 - Perl5の後継言語として開発されているPerl6はMoarVMと呼ばれるVMを搭載している. | |
9 - Perl6はMoarVM,JVM,JavaScript上で動くRakudoと呼ばれる実装と,コンパイラ開発者用のサブセットであるNQPが主な実装となっている. | |
10 - 現在Perl6及びMoarVMは全体的な速度がPerl5と比較し低下しており,実務として利用できるレベルに達していない. | |
11 - さらにPerl6の実装自体巨大なcase-switch文など見通しが悪くなっている. | |
12 - この問題を解決するために現在当研究室で開発している継続を中心にしたContinuation based Cを用いて改良を行う | |
13 - CbCの設計理念からVMの実装と親和性が高い事も推測できる為,実際にCbCを用いてどのようにVMが実装できるかを検証する | |
14 | |
15 # 今週の進捗 | |
16 | |
17 * JVM版Perl6をBuildしました | |
18 * logアナライザーを作成して時間計測を行いました | |
19 * 院試出願しました | |
20 * 趣味でPerl2をbuildしてます | |
21 | |
22 # ログアナライザー(Perl5) | |
23 | |
24 ```perl5 | |
25 #!/usr/bin/env perl | |
26 use strict; | |
27 use warnings; | |
28 use Time::HiRes qw/gettimeofday tv_interval/; | |
29 | |
30 my $t0 = [gettimeofday]; | |
31 | |
32 my $file = "/var/log/system.log"; | |
33 | |
34 if(@ARGV == 2){ | |
35 if ( $ARGV[0] eq "-f"){ | |
36 $file = $ARGV[1]; | |
37 } | |
38 } | |
39 | |
40 my $user_name = qr/anatofuzMBP|anatofuz-15/; | |
41 open my $fh, "<",$file; | |
42 my $count = {}; | |
43 | |
44 while (my $line = <$fh>) { | |
45 if ( $line =~ /\w \d{0,2} (?:\d{2}:?){3} $user_name ([\w.]+)\[\d+\]/){ | |
46 $count->{$1}++; | |
47 } | |
48 } | |
49 | |
50 my $sum = 0; | |
51 | |
52 for my $key (keys %$count){ | |
53 $sum += $count->{$key}; | |
54 } | |
55 | |
56 print "$sum\n"; | |
57 my $t1 = [gettimeofday]; | |
58 | |
59 my $evec_time = tv_interval($t0,$t1); | |
60 print "$evec_time\n"; | |
61 | |
62 ``` | |
63 | |
64 # ログアナライザー(Ruby) | |
65 | |
66 ```ruby | |
67 #!/usr/bin/env ruby | |
68 | |
69 require 'benchmark' | |
70 | |
71 result = Benchmark.realtime do | |
72 file = "/var/log/system.log" | |
73 | |
74 user_name = Regexp.new("anatofuzMBP|anatofuz-15") | |
75 count = Hash.new(0) | |
76 | |
77 File.open(file,'r') do |f| | |
78 f.each_line do |line| | |
79 if line =~ /\w+ \d{0,2} (?:\d{2}:?){3} #{user_name} ([\w.]+)\[\d+\]/ | |
80 count[$1] += 1 | |
81 end | |
82 end | |
83 end | |
84 | |
85 | |
86 sum = 0 | |
87 | |
88 for key in count.keys | |
89 sum += count[key] | |
90 end | |
91 | |
92 p sum | |
93 end | |
94 #p "#{Time.now - start_time}" | |
95 puts "#{result}" | |
96 | |
97 ``` | |
98 | |
99 # ログアナライザー(Perl6) | |
100 | |
101 ```perl6 | |
102 #!/usr/bin/env perl | |
103 use v6; | |
104 | |
105 my $start = DateTime.now; | |
106 | |
107 unit sub MAIN(:f($file) where { .IO.f } = '/var/log/system.log'); | |
108 | |
109 my $user_name = /'anatofuzMBP'|'anatofuz-15'/; | |
110 my $fh = open $file,:r; | |
111 my %count =(); | |
112 | |
113 for $fh.lines -> $line { | |
114 if ( $line ~~ /\w+ \s \d**0..3 \s [\d**2\:?]**3 \s $user_name \s (<[\w.]>+)\[\d+\]/) { | |
115 %count{$0}++; | |
116 } | |
117 } | |
118 $fh.close; | |
119 my $sum = 0; | |
120 | |
121 for %count.keys -> $key { | |
122 $sum += %count{$key}; | |
123 } | |
124 | |
125 $sum.say; | |
126 | |
127 my $end = DateTime.now; | |
128 | |
129 my $time = $end - $start; | |
130 say $time; | |
131 | |
132 ``` | |
133 | |
134 # ログアナライザー(Python) | |
135 | |
136 ```python | |
137 #!/usr/bin/env python | |
138 import re | |
139 import sys | |
140 from collections import defaultdict | |
141 import time | |
142 | |
143 start_time = time.time() | |
144 | |
145 file_path = "/var/log/system.log" | |
146 args = sys.argv | |
147 | |
148 if args == 3: | |
149 if args[1] == "-f": | |
150 file_path = args[2] | |
151 | |
152 count = defaultdict(int) | |
153 | |
154 with open(file_path) as f: | |
155 for line in f: | |
156 match = re.search(r'\w+ \d{0,2} (?:\d{2}:?){3} (?:anatofuzMBP|anatofuz-15) ([\w.]+)\[\d+\]',line) | |
157 if match: | |
158 count[match.group(1)]+=1 | |
159 | |
160 total = 0 | |
161 | |
162 for key in count.keys(): | |
163 total +=count[key] | |
164 | |
165 print(total) | |
166 | |
167 end_time = time.time() | |
168 | |
169 print(end_time - start_time) | |
170 | |
171 ``` | |
172 | |
173 # ログアナライザー(java) | |
174 | |
175 ```java | |
176 package com.google.anatofuz; | |
177 | |
178 import java.io.File; | |
179 import java.io.FileReader; | |
180 import java.io.BufferedReader; | |
181 import java.io.FileNotFoundException; | |
182 import java.io.IOException; | |
183 import java.util.*; | |
184 import java.util.regex.Pattern; | |
185 import java.util.regex.Matcher; | |
186 | |
187 public class LogAnalyzer { | |
188 | |
189 public static void main(String args[]) { | |
190 | |
191 long start = System.currentTimeMillis(); | |
192 File file = new File("/var/log/system.log"); | |
193 | |
194 if (args.length != 0) { | |
195 if (args[0].equals("-f")) { | |
196 file = new File(args[1]); | |
197 } | |
198 } | |
199 | |
200 try { | |
201 FileReader filereader = new FileReader(file); | |
202 BufferedReader bufferedReader = new BufferedReader(filereader); | |
203 | |
204 String line; | |
205 Map<String,Integer> map = new HashMap<String,Integer>(0); | |
206 Pattern p = Pattern.compile("\\w+ \\d{0,2} (?:\\d{2}:?){3} (?:anatofuzMBP|anatofuz-15) ([\\w.]+)\\[\\d+\\]"); | |
207 | |
208 | |
209 while ((line = bufferedReader.readLine()) != null) { | |
210 Matcher matcher = p.matcher(line); | |
211 if (matcher.find()) { | |
212 map.merge(matcher.group(1),1,Integer::sum); | |
213 } | |
214 } | |
215 | |
216 int sum = 0; | |
217 | |
218 for (String key :map.keySet()){ | |
219 sum += map.get(key); | |
220 } | |
221 | |
222 System.out.println(sum); | |
223 | |
224 long end = System.currentTimeMillis(); | |
225 | |
226 System.out.println("0.0" + (end - start)); | |
227 | |
228 } catch (FileNotFoundException ex){ | |
229 System.out.println(ex); | |
230 } catch (IOException ex){ | |
231 System.out.println(ex); | |
232 } | |
233 } | |
234 } | |
235 | |
236 ``` | |
237 | |
238 # 計測結果 | |
239 | |
240 * 結果をブログに載せたら起動時間の比較と突っ込まれる | |
241 | |
242 ``` | |
243 perl6(moar) | |
244 950 | |
245 /Users/anatofuz/workspace/cr/Basic/build_perl6/bin/perl6 log_analyze.p6 0.94s user 0.05s system 128% cpu 0.769 total | |
246 | |
247 perl6(jvm) | |
248 ./perl6 ~/workspace/cr/Basic/perl6/sandbox/log/log_analyze.p6 17.51s user 0.61s system 439% cpu 4.118 total | |
249 | |
250 | |
251 perl5 | |
252 950 | |
253 perl log_analyze.pl 0.04s user 0.04s system 86% cpu 0.098 total | |
254 | |
255 ruby | |
256 950 | |
257 ruby log_analyze.rb 0.16s user 0.06s system 92% cpu 0.243 total | |
258 | |
259 java | |
260 java -jar java/build/libs/anatofuz-1.0-SNAPSHOT.jar 0.27s user 0.05s system 149% cpu 0.212 total | |
261 | |
262 time python log_analyze.py | |
263 python log_analyze.py 0.07s user 0.05s system 77% cpu 0.153 total | |
264 ``` | |
265 | |
266 | |
267 | |
268 # 内部処理 | |
269 | |
270 * 内部処理時間のみ計測 | |
271 * perl5 | |
272 * 0.003434s | |
273 * Ruby | |
274 * 0.046458s | |
275 * Python | |
276 * 0.0097 | |
277 * Java | |
278 * 0.047 | |
279 * Perl6(Moar) | |
280 * 0.2649 | |
281 * Perl6(JVM) | |
282 * 0.687 | |
283 | |
284 ``` | |
285 perl5 | |
286 0.003434 | |
287 perl log_analyze.pl 0.04s user 0.04s system 76% cpu 0.105 total | |
288 | |
289 ===== | |
290 ruby | |
291 0.04645899997558445 | |
292 ruby log_analyze.rb 0.15s user 0.05s system 85% cpu 0.239 total | |
293 ===== | |
294 | |
295 python log_analyze.py | |
296 0.009788036346435547 | |
297 | |
298 ===== | |
299 | |
300 java | |
301 0.047 | |
302 java -jar java/build/libs/anatofuz-1.0-SNAPSHOT.jar 0.27s user 0.05s system 151% cpu 0.209 total | |
303 | |
304 ===== | |
305 perl6 | |
306 0.2649038 | |
307 /Users/anatofuz/workspace/cr/Basic/build_perl6/bin/perl6 log_analyze.p6 0.86s user 0.08s system 109% cpu 0.856 total | |
308 | |
309 ===== | |
310 perl6(jvm) | |
311 WARNING: An illegal reflective access operation has occurred | |
312 WARNING: Illegal reflective access by org.perl6.nqp.runtime.Ops (file:/Users/anatofuz/workspace/cr/Basic/jvm/nqp/install/share/nqp/runtime/nqp-runtime.jar) to field sun.management.RuntimeImpl.jvm | |
313 WARNING: Please consider reporting this to the maintainers of org.perl6.nqp.runtime.Ops | |
314 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations | |
315 WARNING: All illegal access operations will be denied in a future release | |
316 0.687 | |
317 /Users/anatofuz/workspace/cr/Basic/jvm/rakudo/perl6 21.48s user 0.72s system 436% cpu 5.087 total | |
318 | |
319 ``` | |
320 | |
321 | |
322 # 院試 | |
323 | |
324 * 出願しました | |
325 * 過去問やってます | |
326 | |
327 # Perl2 | |
328 | |
329 * Perl5のgitリポジトリにtagとして残っていました | |
330 * gcc/cc1でbuild出来るようにパッチを書いてます | |
331 * gccを参照するように変更 | |
332 * `<command-line>`というヘッダーファイルを削除 | |
333 * `sprintf`などの関数の返り値を修正 | |
334 * yaccのシンタックスエラーを解消 |