comparison slides/2018/07/17/slide.md @ 49:49a9086fc7e9

auto-Update generated slides by script
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 31 Jul 2018 18:28:00 +0900
parents
children
comparison
equal deleted inserted replaced
48:bc8b0482c14f 49:49a9086fc7e9
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のシンタックスエラーを解消