teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

誤字の修正

2019/04/08 15:43

投稿

atata0319
atata0319

スコア881

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  MemoryMappedViewAccessor.WriteArray は最終的に以下のメソッドによって処理されています。
4
4
  [SafeBuffer.WriteArray](https://referencesource.microsoft.com/#mscorlib/system/runtime/interopservices/safebuffer.cs,a99117a5b07907f0)
5
- このメソッドを見ていただくとわかる通り、GenericStructureToPtr メソッドをループして呼び出しているだけです。3000 x 3000 の 24 ビットビットマップであれば、これを 2700 万回繰り返して呼び出すために提示されているぐらいの時間がかかっています。
5
+ このメソッドを見ていただくとわかる通り、GenericStructureToPtr メソッドをループして呼び出しているだけです。3000 x 3000 の 24 ビットビットマップであれば、これを 2700 万回繰り返して呼び出すために提示されているぐらいの時間がかかっていると推測されます。
6
6
 
7
7
  単純にバイト書き込みだけであれば、以下のように MemoryMappedViewStream を使用すると高速化可能です。これで単純なメモリコピーの 2 倍ぐらいの速度にはなるかと思います。
8
8
  ```C#

1

誤字の修正

2019/04/08 15:43

投稿

atata0319
atata0319

スコア881

answer CHANGED
@@ -1,4 +1,4 @@
1
- メモリマップドファイルと遅いという結論になってしまっていますが、実際には違います。提示されているコードが遅い原因は MemoryMappedViewAccessor.WriteArray の実装に起因しています。メモリマップドファイルは効率的にディスクアクセスするため、ディスクとマッピングした場合も該当ディスクに対するシーケンシャル書き込みに準じた性能が出るはずです。ディスクにマッピングしない場合は通常のメモリアクセスよりやや遅いていどの速度にはなるはずす。コメントに記載されている5倍以上の速度差というのはちょっと考えられません。
1
+ メモリマップドファイルと遅いという結論になってしまっていますが、実際には違います。提示されているコードが遅い原因は MemoryMappedViewAccessor.WriteArray の実装に起因しています。メモリマップドファイルは効率的にディスクアクセスするため、ディスクとマッピングした場合も該当ディスクに対するシーケンシャル書き込みに準じた性能が出るはずです。ディスクにマッピングしない場合は通常のメモリアクセスよりやや遅いていどの速度にはなるはずす。コメントに記載されている5倍以上の速度差というのはちょっと考えられません。
2
2
 
3
3
  MemoryMappedViewAccessor.WriteArray は最終的に以下のメソッドによって処理されています。
4
4
  [SafeBuffer.WriteArray](https://referencesource.microsoft.com/#mscorlib/system/runtime/interopservices/safebuffer.cs,a99117a5b07907f0)