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

質問編集履歴

3

ソースコードの追記

2021/01/10 13:30

投稿

hanbee.com
hanbee.com

スコア52

title CHANGED
File without changes
body CHANGED
@@ -12,13 +12,14 @@
12
12
  Me.bihin = New System.Windows.Forms.PictureBox(10, 10) {}
13
13
  Dim img As Image
14
14
  Dim fs As FileStream
15
+  Dim adress(10, 10) As String
15
16
  'Stopwatchオブジェクトを作成する
16
17
  Dim sw As New System.Diagnostics.Stopwatch()
17
18
  'ストップウォッチを開始する
18
19
  sw.Start()
19
20
  for i = 0 to 10
20
21
  for i = 0 to 10
21
- 'DBからファイルパスを取得する
22
+ 'DBからファイルパスを取得する
22
23
  adress(i, j) = command.ExecuteScalar()
23
24
  Next
24
25
  Next
@@ -34,6 +35,7 @@
34
35
 
35
36
  for i = 0 to 10
36
37
  for i = 0 to 10
38
+ '取得したファイルパスから描画を行う。
37
39
  Me.bihin(i, j) = New System.Windows.Forms.PictureBox()
38
40
  fs = File.OpenRead(sResult)
39
41
  img = Image.FromStream(fs, False, False)

2

計測したコードについて追記しました。

2021/01/10 13:30

投稿

hanbee.com
hanbee.com

スコア52

title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,9 @@
1
1
  お世話になっております。私の周りにVB.netを使える人はあまりおらず、ネット検索やこのサイトに助けてもらいながらやっているものです。どうしても、一人では詰んでしまうので、助言やヒントだけでも頂けたらと思っています。
2
2
  すでに一応完成しているアプリの動作で一度に多数の画像描画を行うイベントがあります。
3
3
  以下のソースコードのようにして、New句でpictureboxのインスタンスを複数個作っています。
4
- しかし、この動作が少々重く、5秒くらいかかっています。(画像を描写する処理しかないので、計測はしていません。)
4
+ しかし、この動作が少々重く、5秒くらいかかっています。
5
+ (レイアウトオブジェクトを生成するコードについては割愛します。)
5
6
 
6
-
7
7
  ```vb.net
8
8
  Public Class tanakakudai
9
9
  Private bihin(,) As System.Windows.Forms.PictureBox
@@ -12,10 +12,28 @@
12
12
  Me.bihin = New System.Windows.Forms.PictureBox(10, 10) {}
13
13
  Dim img As Image
14
14
  Dim fs As FileStream
15
+ 'Stopwatchオブジェクトを作成する
16
+ Dim sw As New System.Diagnostics.Stopwatch()
17
+ 'ストップウォッチを開始する
18
+ sw.Start()
19
+ for i = 0 to 10
20
+ for i = 0 to 10
21
+ 'DBからファイルパスを取得する
22
+ adress(i, j) = command.ExecuteScalar()
23
+ Next
24
+ Next
25
+
26
+ 'ストップウォッチを止める
27
+ sw.Stop()
28
+ '結果を表示する
29
+ Console.WriteLine("DBからの読み取り時間は")
30
+ Console.WriteLine(sw.Elapsed)
31
+ 'ストップウォッチをリセットしてから再開する
32
+ sw.Reset()
33
+ sw.Start()
34
+
15
35
  for i = 0 to 10
16
36
  for i = 0 to 10
17
- 'DBで画像のアドレスを持ってくる
18
-
19
37
  Me.bihin(i, j) = New System.Windows.Forms.PictureBox()
20
38
  fs = File.OpenRead(sResult)
21
39
  img = Image.FromStream(fs, False, False)
@@ -23,6 +41,11 @@
23
41
  Me.Controls.Add(bihin(i, j))
24
42
  Next
25
43
  Next
44
+ 'ストップウォッチを止める
45
+ sw.Stop()
46
+ '結果を表示する
47
+ Console.WriteLine("描画にかかる時間は")
48
+ Console.WriteLine(sw.Elapsed)
26
49
  End Class
27
50
  ```
28
51
 
@@ -34,7 +57,7 @@
34
57
 
35
58
  〇追記
36
59
  前回の質問の時から、計測をするように回答してくださっていた方、ご忠告に従わず失礼しました。
37
- YAmagaGNZさんの回答への返信でも書きましたが、重い腰を上げて計測を行った結果を以下に報告します。
60
+ YAmaGNZさんの回答への返信でも書きましたが、重い腰を上げて計測を行った結果を以下に報告します。
38
61
  1. その他レイアウトオブジェクトの生成など: 0.00257s
39
62
  2. DBから画像ファイルパスなどの読み出し:0.0129663s
40
63
  3. 画像ファイルパスからimageプロパティに変換してpictureboxに描画:0.0069787s

1

計測したデータを追記

2021/01/10 13:26

投稿

hanbee.com
hanbee.com

スコア52

title CHANGED
File without changes
body CHANGED
@@ -29,4 +29,18 @@
29
29
  違う質問で、ある方に、画像を読み込むのではなく、Bitmapクラスを読み込んでクラスメンバとして保持するクラスを用意しておけば、EXE起動時にすべての画像を読み込んでおけば画像の読み込みは一回で済み、ある程度速くなるのではないかとも紹介されています。
30
30
  その方法をぜひやってみたいと思いますが、クラスメンバに保持するのはどのようにすればよいのでしょうか。
31
31
  なんとなくイメージはできるのですが、実際に参考になるソースコードが分からず、、困っています。
32
- 参考にできるサイトの紹介とかだけでもいいので、宜しくお願い致します。
32
+ 参考にできるサイトの紹介とかだけでもいいので、宜しくお願い致します。
33
+
34
+
35
+ 〇追記
36
+ 前回の質問の時から、計測をするように回答してくださっていた方、ご忠告に従わず失礼しました。
37
+ YAmagaGNZさんの回答への返信でも書きましたが、重い腰を上げて計測を行った結果を以下に報告します。
38
+ 1. その他レイアウトオブジェクトの生成など: 0.00257s
39
+ 2. DBから画像ファイルパスなどの読み出し:0.0129663s
40
+ 3. 画像ファイルパスからimageプロパティに変換してpictureboxに描画:0.0069787s
41
+ 4. loadイベント全体でかかった時間: 0.0217302s
42
+ 以上の結果でした。
43
+ これは割と性能のいいノートPCで行っているため、処理が速いですが、実際にこのアプリ用に使っている
44
+ タブレット端末は中古品で性能も悪く、5秒くらいかかってしまっています。
45
+ やはり、Bitmapクラスを読み込んでクラスメンバとして保持するクラスを用意していおいて全ての画像を読み込んでおけば項番2,3の動作が速くなると思います。(DBからファイルパスを持ってきて、imageプロパティに変換するというのを全部EXE起動時にやっておいた方が速くなると思います。)
46
+ なので、もっと速くする余地はありそうなので、これらのプログラム修正を行っていきたいと思います。