More Related Content
PPTX
PPTX
An other world awaits you PPTX
BIAC 6 Final Presentation PDF
わんくま名古屋 #40 (20161217) Xamarinで自動化テストしよう PDF
わんくま名古屋 #38 (20160521) Xamarin入門 PPTX
PPTX
Visual Studio による開発環境・プログラミングの進化 PDF
Windows 8時代のUXを支える非同期プログラミング Similar to わんくま名古屋#28(20130824) c#で、ライフゲームを高速化してみるよ
PPTX
Orange Cube 自社フレームワーク 2015/3 PPTX
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE) PPTX
PPT
“なめらか”なメトロスタイルアプリを作るために ~WinRT の非同期性を活用したアプリ開発~ PPTX
PDF
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~ PDF
PPTX
Visual Studio 2008による 開発環境・プログラミングの進化 PPTX
Visual Studio Online BUILD を本気で使いこなして品質&効率を劇的に上げる! [ Comm Tech Festival ] C-4 PDF
わんくま名古屋#31(20140524) ユニバーサルWindowsアプリ開発の勧め PDF
わんくま名古屋#25(20121201) TDD道場#13 ~ Metroアプリをテストファーストするときのポイント PPTX
わんくま名古屋 #37 (20151114) TDD道場 #25 PDF
わんくま名古屋#25(20121201) LT:「開発体験テンプレートを使ったストアアプリの作成」 PPT
Vsugday2012 summer tokyo_aoyagi PDF
Efsta cod2012 master_for_slideshare PDF
Metroアプリケーションのwin8/wp7の効率的ソース運用を考える PPTX
PDF
PDF
PPTX
More from Yasuhiko Yamamoto
PPTX
わんくま名古屋 #37 (20151114) Windows 10 UWP アプリ開発入門(実践編) PDF
第8回業開中心会議 「Windows 10 ユニバーサルアプリの概要」 PDF
UWP アプリを JavaScript で作る 3つの方法 PPTX
Windowsストアアプリでウイルスを作るには!? cod2013名古屋 PDF
Visual Studio 2015 の新機能: Pex はユニットテストの福音となるか!? PPT
タダで始めるテストファースト入門 ~ C# Express + NUnit PPTX
わんくま名古屋#27(20130518) データバインディングを極める PDF
わんくま名古屋#36 (20150725) Windows 10 ユニバーサル Windows アプリ開発入門 PDF
わんくま名古屋#34(20150214) TDD道場#22 PDF
わんくま名古屋#33(20141115) TDD道場#21 PPTX
わんくま名古屋 #29 (2013/11/23) TDD道場 #17 PDF
わんくま名古屋#33(20141115) モノ作り半生 PDF
無償のVisual studioで作るクライアント アプリ PPTX
わんくま名古屋 #32 (20140823) TDD道場 #20 PPTX
Windows 8.1 Update 1 の噂をまとめてみた PDF
プログラマとデザイナで時計を作るVisual studioハッカソン ~ TDDの考え方を開発全体に応用してみよう! PDF
開発ツールを買わずに作る♪ ユニバーサルWindowsアプリ! PDF
Windows ストア アプリでスレッド間排他処理 PPTX
Windows 8.1 ストア アプリ first look for 8.0 developers! [ss] PDF
わんくま名古屋#31(20140524) TDD道場 #19 Recently uploaded
PDF
エンジニアが選ぶべきAIエディタ & Antigravity 活用例@ウェビナー「触ってみてどうだった?Google Antigravity 既存IDEと... PDF
流行りに乗っかるClaris FileMaker 〜AI関連機能の紹介〜 by 合同会社イボルブ PPTX
楽々ナレッジベース「楽ナレ」3種比較 - Dify / AWS S3 Vector / Google File Search Tool PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #2 PDF
20251210_MultiDevinForEnterprise on Devin 1st Anniv Meetup PDF
Machine Tests Benchmark Suite. Explain github.com/alexziskind1/machine_tests #1 わんくま名古屋#28(20130824) c#で、ライフゲームを高速化してみるよ
- 1.
- 2.
- 3.
わんくま同盟 名古屋勉強会 #28
スピーカー紹介• 1957: スプートニク以前
に誕生 (宇宙世紀未満)
• 1983: 名古屋大学工学部(修
士)卒
• HONDA R&Dで自動車設計
• 1994~ ソフトウェア業界
• 2012~ BluewaterSoft
biac (山本 康彦)
http://www.bluewatersoft.jp
3
- 4.
わんくま同盟 名古屋勉強会 #28
スピーカー紹介• 本を書いたり
biac (山本 康彦)
http://www.bluewatersoft.jp
速攻入門 C# プログラミング
技術評論社、共著
2012/3
Windows 8
業務アプリ開発読本
技術評論社、共著
2013/3
C#によるマルチコアのための非
同期/並列処理プログラミング
技術評論社
2013/7
今日の話は、
この第4部から!
4
- 5.
わんくま同盟 名古屋勉強会 #28
スピーカー紹介• 記事を書いたり
biac (山本 康彦)
http://www.bluewatersoft.jp WinRT/Metro TIPS
@IT ~ 連載中
http://www.atmarkit.co.jp/ait/subtop/features/da/ap_winrttips_index.html
C#で始めるテスト駆動開発入門
CodeZine
http://codezine.jp/article/corner/446
特集: 次期 Windows 8.1 &
Visual Studio 2013
Preview 概説
@IT 2013/7
http://www.atmarkit.co.jp/ait/articles/1307/19/news099.html
5
- 6.
- 7.
わんくま同盟 名古屋勉強会 #28
スピーカー紹介• 講師やったりしてます
biac (山本 康彦)
http://www.bluewatersoft.jp
C# / VB.NET による
Windows 8 アプリ開発入門
2013/10/30~31
名古屋ソフトウェアセンター
http://www.nagoya-sc.co.jp/ap/seminar?m=1&key=10734
7
- 8.
わんくま同盟 名古屋勉強会 #28
新刊紹介
•2013/7/20上梓
• 電子書籍版もあります
https://gihyo.jp/dp/ebook/2013/978-4-7741-5907-2
• C#はやってるけど、非同期/並列
処理は「?」という開発者に!
C#によるマルチコアのための
非同期/並列処理プログラミング
http://www.amazon.co.jp/dp/4774158283/?tag=bluewatersoft-22
8
- 9.
わんくま同盟 名古屋勉強会 #28
新刊紹介
■はじめに
この本は第一に,.NETFramework で,非
同期処理,並列処理を効率良く実現できる
マルチスレッドのプログラムを作りたいと
思っている開発者のために書きました.
.NET Framework での(マルチスレッドで
はないプログラムの)開発経験があること
を前提にしています.
また,すでにマルチスレッドの経験のある
プログラマーにとっては,ハンドブックと
なるように,そして最新の.NET
Framework による効率的なプログラミング
を伝えられるようにと書き進めました.
C#によるマルチコアのための
非同期/並列処理プログラミング
http://www.amazon.co.jp/dp/4774158283/?tag=bluewatersoft-22
9
- 10.
わんくま同盟 名古屋勉強会 #28
新刊紹介
■目次
Part1 マルチコアのための非同期処理/並列
処理の原理
Chapter 1 マルチコアを使いこなす
非同期処理/ 並列処理の時代
Chapter 2 試して納得!
マルチコア活用プログラミングの原理とポイント
Part 2 マルチコアを使いこなすための非同
期/並列処理必須知識
Part 3 マルチコアのためのC#/.NETの非同
期/並列処理の方法
Part 4 マルチコア非同期/並列処理実践プロ
グラミング
C#によるマルチコアのための
非同期/並列処理プログラミング
http://www.amazon.co.jp/dp/4774158283/?tag=bluewatersoft-22
10
今日の話は、
ここから!
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
わんくま同盟 名古屋勉強会 #28
ロジック側
publicclass LangtonsLoops {
//「世界」(intの2次元配列)
int[,] _lives;
public int[,] Lives { get { return _lives; } }
// セルオートマトンの規則
Rule _rule;
public void Update() {
// 隣を見る(観測し終わるまで_livesを変更してはいけない)
for (int r = 1; r < _size - 1; r++)
for (int c = 1; c < _size - 1; c++)
//…
// 次ステップの状態を計算して_livesを書き換える
for (int r = 1; r < _size - 1; r++)
for (int c = 1; c < _size - 1; c++)
//…
}
}
17
これは並列化
するしか!
でもそれは
後のお楽しみ♪
- 18.
わんくま同盟 名古屋勉強会 #28
画面側
privateasync Task RunLoops()
{
while (_isRunning)
{
_langtonsLoops.Update(); //ロジックを1ステップ計算させる
UpdateBitmap(_langtonsLoops.Lives); //画面を更新する
await Task.Yield(); // 画面更新の機会を与える(DoEventsの代用)
}
}
18
計算中は
画面がフリーズ
画面更新中は
計算せず
- 19.
- 20.
- 21.
わんくま同盟 名古屋勉強会 #28
画面をフリーズさせない非同期
privateasync Task RunLoops()
{
while (_isRunning)
{
// await Task.Runで囲って非同期にする
await Task.Run(()=>
_langtonsLoops.Update(); //ロジックを1ステップ計算させる
);
UpdateBitmap(_langtonsLoops.Lives); //画面を更新する
//await Task.Yield(); // DoEvents(の代用)は不要になった
}
}
21
・やっぱりロジックの後で画面更新
・やっぱり画面更新中は計算せず
- 22.
わんくま同盟 名古屋勉強会 #28
ロジックを全速力で走らせる非同期(1/2)
publicclass LangtonsLoops { // ロジック側
// 変更を画面に通知するためのイベント
public event PropertyChangedEventHandler PropertyChanged;
public async Task RunLoopsAsync() {
// フラグが立っている間、非同期で計算し続ける
await Task.Run(() => {
while (_isRunning) {
Update();
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs("Lives"));
}
});
//…
}
// ……以下略……
22
- 23.
わんくま同盟 名古屋勉強会 #28
ロジックを全速力で走らせる非同期(2/2)
publicsealed partial class MainPage : LayoutAwarePage { // 画面側
// ロジックを起動する
private async Task RunLoops() {
//…
await _langtonsLoops.RunLoopsAsync();
}
// ロジックから呼び出されるイベントハンドラー
async void LangtonsLoops_PropertyChanged(object sender, PropertyChangedEventArgs e) {
if (e.PropertyName == "Lives") {
//…UpdateBitmapしてるときは、イベントを無視してここでリターン…
await _thisDispatcher.RunAsync( // UIスレッドで実行する
Windows.UI.Core.CoreDispatcherPriority.Normal,
() => { UpdateBitmap(_langtonsLoops.Lives); //…
});
//…
}
}
// ……以下略……
23
- 24.
わんくま同盟 名古屋勉強会 #28
あれっ!?排他は?
• 2 次元配列 Livesを双方からアクセスする
⇒ 排他制御しないとマズイんじゃね?
• よく考えてみる。
ロジック: Livesを読み書き
画面:Livesから読み出すだけ
中途半端に読み出しても、多少画面が乱れ
るだけ(たぶん誰も気付かない)
⇒ 排他制御しなくていいじゃん!
24
- 25.
- 26.
- 27.
わんくま同盟 名古屋勉強会 #28
ロジックを並列化する
publicclass LangtonsLoops {
//……省略……
public void Update() {
// 隣を見る(観測し終わるまで_livesを変更してはいけない)
Parallel.For(1, _size - 1, (r) => {
for (int c = 1; c < _size - 1; c++) {
//……隣を観測してメモリに保持……
}
});
// 次ステップの状態を計算して_livesを書き換える
Parallel.For(1, _size - 1, (r) => {
for (int c = 1; c < _size - 1; c++) {
//……隣の観測結果から、次ステップを計算し、_livesに書き込み
}
});
}
27
- 28.
わんくま同盟 名古屋勉強会 #28
あれっ!?排他は?
• 2 次元配列 Livesを、複数のスレッドから
アクセスする
⇒ 排他制御しないとマズイんじゃね?
• よく考えてみる。
アクセスする場所は?
r(行)とc(列)で指定された要素。
これはスレッドごとに異なる。
⇒ 排他制御しなくていいじゃん!
28
- 29.
わんくま同盟 名古屋勉強会 #28
速度計測結果(例)サイクル
タイム
性能向上 画面描画
速度
最初の実装 0.08秒 --- 12fps
非同期化 0.05秒 1.6倍 16fps
並列化 0.03秒 2.7倍 8fps
※ あくまでも特定の条件で計測し
ただけの参考値です
29
- 30.
- 31.
わんくま同盟 名古屋勉強会 #28
ロジック自体を高速化
•2 つのループを 1 つに
Lives配列を2つ用意して読み出しと書込みを別の配列
に。(1ステップごとに交換)
• 観測用の配列を廃止 (単純な変数に)
• ルールの内部表現をスリム化
ルール参照キーの生成: 乗算と加算 ⇒ ビット演算
その他いろいろ
31
- 32.
わんくま同盟 名古屋勉強会 #28
速度計測結果(例)サイクル
タイム
性能向上 画面描画
速度
最初の実装 0.08秒 --- 12fps
非同期化 0.05秒 1.6倍 16fps
並列化 0.03秒 2.7倍 8fps
チューン 0.01秒 8倍 10fps
※ あくまでも特定の条件で計測し
ただけの参考値です
32
- 33.
- 34.
わんくま同盟 名古屋勉強会 #28
一般的には、こんな順序で
非同期化
•画面とロジックを非同期化
⇒ お互い足を引っ張らないように!
並列化
• ロジックを並列化
⇒ 並列処理にして処理時間を短縮
ロジック
• ロジックを改良してさらに高速化
※先にやっちゃうと、並列化がわけわかめ
34
+ 排他制御は、よくよく考えて!
※不要なことも多い。ムダな排他は低速化とバグの元
- 35.
わんくま同盟 名古屋勉強会 #28
今日のネタ
•今日のソースコード
gihyo.jpのサポートページに
あります
http://gihyo.jp/book/2013/978-4-
7741-5828-0/support
C#によるマルチコアのための
非同期/並列処理プログラミング
http://www.amazon.co.jp/dp/4774158283/?tag=bluewatersoft-22
35
- 36.