Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020

337 views

Published on

「C# ドキドキ ライブ コーディング!! ~ 小島の分 ~」

BuriKaigi 2020 @ 富山
https://toyama-eng.connpass.com/event/156635/
2020/02/01

Published in: Technology
  • Be the first to comment

C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020

  1. 1. C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ BuriKaigi 2020 @ 富山 2020/02/01 小島 富治雄 #BuriKaigi
  2. 2. 自己紹介 2
  3. 3. 今回はトランプのゲーム「スピード」で対決。 3
  4. 4. どこをhackするか? 4
  5. 5. 今回は6つのhack 5
  6. 6. hack 0. 6
  7. 7. hack 0. 社会的hack 7
  8. 8. hack 1. 8
  9. 9. hack 1. 相手プレイヤーのメソッドの入れ替え 9
  10. 10. public unsafe static void unsafe if int int int int else long long long long hack 1. 相手プレイヤーのメソッドの入れ替え 1
  11. 11. unsafe hack 1.1 相手プレイヤーのメソッドの入れ替え - 動的な unsafe アセンブリの生成 - その1 動的コンパイル 11
  12. 12. var codeProvider = new CSharpCodeProvider(); var compiler = codeProvider.CreateCompiler(); var parameters = new CompilerParameters { GenerateInMemory = true, CompilerOptions = "/unsafe" }; parameters.ReferencedAssemblies.Add("System.Reflection.dll"); var sourceText = "using System;¥n" + "using System.Reflection;¥n" + "public class MethodReplacer {¥n" + " public unsafe static void Replace(MethodInfo targetMethod, MethodInfo methodToInject) {¥n" + " // Hack!¥n" + " }¥n" + "}¥n"; var results = compiler.CompileAssemblyFromSource(parameters, sourceText); hack 1.1. 相手プレイヤーのメソッドの入れ替え - 動的な unsafe アセンブリの生成 - その1 動的コンパイル 12
  13. 13. hack 1.1. 相手プレイヤーのメソッドの入れ替え - 動的な unsafe アセンブリの生成 - その1 動的コンパイル 例外 PlatformNotSupportedException "Operation is not supported on this platform." 13
  14. 14. hack 1.2. 相手プレイヤーのメソッドの入れ替え - 動的な unsafe アセンブリの生成 - その2 コンパイル済みのアセンブリを動的に読み込み 14
  15. 15. hack 1.2. 相手プレイヤーのメソッドの入れ替え - 動的な unsafe アセンブリの生成 - その2 コンパイル済みのアセンブリを動的に読み込み const string "KojimaLib" static string $" .dll" // Base64でエンコードされたアセンブリ const string "TVqQAAMAAAAEAA...A=" var using var new using var new var if null return // リフレクションでメソッドを呼ぶ… 15
  16. 16. public unsafe static void unsafe if int int int int else long long long long hack 1. 相手プレイヤーのメソッドの入れ替え .NET Core だと うまくいかない! 16
  17. 17. hack 2. 17
  18. 18. hack 2. SpeedApp.Console.exe 18
  19. 19. https://www.youtube.com /watch?v=bqyv3X66TZU
  20. 20. 10,000回勝負 しても5秒くらい https://www.youtube.com /watch?v=eNP3XVfl4F0
  21. 21. hack 3. 21
  22. 22. hack 3. まじめに高速化 22
  23. 23. hack 3. まじめに高速化 23
  24. 24. hack 3. まじめに高速化 24
  25. 25. static int var for var return static int ListをCountを変数にしてからforする(List<Foo> foos) { var sum = 0; var count = foos.Count; for (var index = 0; index < count; index++) sum += foos[index].Value; return sum; } static int Listをforeachする(List<Foo> foos) { var sum = 0; foreach (var foo in foos) sum += foo.Value; return sum; } hack 3. まじめに高速化 - for ループの高速化 25
  26. 26. hack 3. まじめに高速化 - for ループの高速化 forとforeachのどっちが速いかテスト 結果 (コレクションの要素数: 3, 回数: 100,000,000): 1. Listをforするテスト - 0.509秒 2. ListをCountを変数にしてからforするテスト - 0.591秒 3. ListをIListとしてCountを変数にしてからforするテスト- 2.066秒 4. Listをforeachするテスト - 2.488秒 5. ListをIListとしてforするテスト - 3.529秒 6. ListをIListとしてforeachするテスト - 9.031秒 26
  27. 27. 参考: 配列を順次アクセスするだけでも… ※ BenchmarkDotNet を使用 27
  28. 28. hack 4. 28
  29. 29. hack 4. シャッフルで工夫(謎) static readonly int[] shuffledCardNumbers = new[] { 1, 1, 6, 6, 11, 11, 3, 3, 8, 8, 13, 13, 5, 5, 10, 10, 2, 2, 7, 7, 12, 12, 4, 4, 9, 9 }; 29
  30. 30. hack 4. シャッフルで工夫(謎) 30 『全100,000ゲームの結果』 小島は99,999勝, 引き分けは1回 / 全100,000回中 それぞれのプレイヤーが速く手札を場に出せた回数: 小島は156,237回, 石野は66,665回
  31. 31. hack 5. 31
  32. 32. hack 5. 「発想の転換」 32
  33. 33. 復習: CPU のキャッシュ メモリー 1次キャッシュ 1次キャッシュ 1次キャッシュ 1次キャッシュ 2次キャッシュ 2次キャッシュ 2次キャッシュ 2次キャッシュ 3次キャッシュ 主メモリー 3次キャッシュは 複数のスレッドで共有 33
  34. 34. hack 5. 「発想の転換」 - 自分以外を遅くする 34
  35. 35. hack 5. 「発想の転換」 - 自分以外を遅くする 35
  36. 36. 『全100,000ゲームの結果』 小島は91,549勝、石野は4,393勝, 引き分けは4,058回 / 全100,000回中 それぞれのプレイヤーが速く手札を場に出せた回数: 小島は459,425回, 石野は150,647回 『全100,000ゲームの結果』 小島は94,573勝、石野は2,616勝, 引き分けは2,811回 / 全100,000回中 それぞれのプレイヤーが速く手札を場に出せた回数: 小島は498,093回, 石野は106,065回 hack 5. 「発想の転換」 - 自分以外を遅くする 36
  37. 37. × × ○ ○ ○ ○ 今回のhack (× 失敗、 ○ 成功) 37

×