質問編集履歴

3

「詳しくは、最下部の「追記」項目をお読みください。「該当のソースコード」項目は読み飛ばしていただいてもかまいません。」を文章内に追記

2018/03/29 17:05

投稿

myora
myora

スコア7

test CHANGED
File without changes
test CHANGED
@@ -16,6 +16,10 @@
16
16
 
17
17
 
18
18
 
19
+ 詳しくは、最下部の「追記」項目をお読みください。「該当のソースコード」項目は読み飛ばしていただいてもかまいません。
20
+
21
+
22
+
19
23
  ### 該当のソースコード
20
24
 
21
25
  こちらがソースコードです。このアプリは、ボタンを押下すると、500点からなる折れ線グラフを描画・更新します。描画する500点は起動時に乱数によって決定します。

2

Itemクラスの修正

2018/03/29 17:05

投稿

myora
myora

スコア7

test CHANGED
File without changes
test CHANGED
@@ -274,18 +274,74 @@
274
274
 
275
275
  {
276
276
 
277
- public class Item : INotifyPropertyChanged
277
+ public class Item : INotifyPropertyChanged
278
278
 
279
279
  {
280
280
 
281
- public double Key { get; set; }
282
-
283
- public double Value { get; set; }
284
-
285
-
286
-
287
281
  public event PropertyChangedEventHandler PropertyChanged;
288
282
 
283
+ private void RaisePropertyChanged([CallerMemberName]string propertyName = null)
284
+
285
+ {
286
+
287
+ if (PropertyChanged != null)
288
+
289
+ PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
290
+
291
+ }
292
+
293
+
294
+
295
+ private double x;
296
+
297
+ private double y;
298
+
299
+
300
+
301
+ public double Key {
302
+
303
+ get { return x; }
304
+
305
+ set {
306
+
307
+ if (value != x)
308
+
309
+ {
310
+
311
+ x = value;
312
+
313
+ RaisePropertyChanged();
314
+
315
+ }
316
+
317
+ }
318
+
319
+ }
320
+
321
+ public double Value
322
+
323
+ {
324
+
325
+ get { return y; }
326
+
327
+ set
328
+
329
+ {
330
+
331
+ if (value != y)
332
+
333
+ {
334
+
335
+ y = value;
336
+
337
+ RaisePropertyChanged();
338
+
339
+ }
340
+
341
+ }
342
+
343
+ }
344
+
289
345
 
290
346
 
291
347
  }

1

メモリリークする、処理が遅くなる、についての詳細な測定結果について「追記」に記載しました

2018/03/29 15:51

投稿

myora
myora

スコア7

test CHANGED
File without changes
test CHANGED
@@ -193,3 +193,261 @@
193
193
 
194
194
 
195
195
  Debug版での実行に基づき、メモリや処理速度を判断しています。
196
+
197
+
198
+
199
+
200
+
201
+ ### 追記
202
+
203
+ メモリリークする、処理が遅くなる、についての詳細な部分について記載します。
204
+
205
+
206
+
207
+ まず、検証するソースコードですが、今後の実用性の観点から以下のようなアプリに変更しました。
208
+
209
+ アプリ概要: 「グラフ生成」と「グラフクリア」の二つのボタンが配置されている。「グラフ生成」ボタンを押下すると、10点分の折れ線グラフが30個描画される。次に、「グラフクリア」ボタンを押下すると、描画されているグラフを消す。
210
+
211
+
212
+
213
+ 「グラフ生成」ボタンを押下後のイメージ
214
+
215
+ ![グラフの描画時](febe0bf33c3ee01171f317c0b7b1e362.png)
216
+
217
+
218
+
219
+ ソースコード
220
+
221
+ ```Xaml
222
+
223
+ <Page
224
+
225
+ x:Class="ChartTest.MainPage"
226
+
227
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
228
+
229
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
230
+
231
+ xmlns:local="using:ChartTest"
232
+
233
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
234
+
235
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
236
+
237
+ xmlns:Charting="using:WinRTXamlToolkit.Controls.DataVisualization.Charting"
238
+
239
+ mc:Ignorable="d">
240
+
241
+
242
+
243
+ <Grid x:Name="Grid" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
244
+
245
+
246
+
247
+ <Charting:Chart Name="LineChart01" Margin="33,154,49,34">
248
+
249
+ </Charting:Chart>
250
+
251
+ <Button Content="グラフ生成" HorizontalAlignment="Left" Height="114" Margin="108,21,0,0" VerticalAlignment="Top" Width="496" Click="Button_Create_Click"/>
252
+
253
+ <Button Content="グラフクリア" HorizontalAlignment="Left" Height="114" Margin="749,21,0,0" VerticalAlignment="Top" Width="496" Click="Button_Clear_Click"/>
254
+
255
+
256
+
257
+ </Grid>
258
+
259
+ </Page>
260
+
261
+ ```
262
+
263
+
264
+
265
+ ```C#
266
+
267
+ using WinRTXamlToolkit.Controls.DataVisualization.Charting;
268
+
269
+
270
+
271
+
272
+
273
+ namespace ChartTest
274
+
275
+ {
276
+
277
+ public class Item : INotifyPropertyChanged
278
+
279
+ {
280
+
281
+ public double Key { get; set; }
282
+
283
+ public double Value { get; set; }
284
+
285
+
286
+
287
+ public event PropertyChangedEventHandler PropertyChanged;
288
+
289
+
290
+
291
+ }
292
+
293
+
294
+
295
+ public sealed partial class MainPage : Page
296
+
297
+ {
298
+
299
+
300
+
301
+ List<ObservableCollection<Item>> itemsList;
302
+
303
+
304
+
305
+ public MainPage()
306
+
307
+ {
308
+
309
+ this.InitializeComponent();
310
+
311
+
312
+
313
+ // 描画するグラフのList生成
314
+
315
+ itemsList = new List<ObservableCollection<Item>>();
316
+
317
+ Random rnd = new System.Random();
318
+
319
+        // 30個のグラフを表示
320
+
321
+ for (int j = 0; j < 30; j++)
322
+
323
+ {
324
+
325
+ // それぞれのグラフに10点の値を入れる。
326
+
327
+ ObservableCollection<Item> items = new ObservableCollection<Item>();
328
+
329
+ for (int i = 0; i < 10; i++)
330
+
331
+ {
332
+
333
+ items.Add(new Item { Key = i, Value = rnd.Next(0, 100) });
334
+
335
+ }
336
+
337
+ itemsList.Add(items);
338
+
339
+ }
340
+
341
+ }
342
+
343
+
344
+
345
+ // ボタンクリックでグラフの生成
346
+
347
+ private void Button_Create_Click(object sender, RoutedEventArgs e)
348
+
349
+ {
350
+
351
+ int i = 0;
352
+
353
+ // グラフの数だけ描画する
354
+
355
+ foreach (var items in itemsList)
356
+
357
+ {
358
+
359
+
360
+
361
+ // LineSeries 生成
362
+
363
+ LineSeries lineSeries = new LineSeries()
364
+
365
+ {
366
+
367
+ ItemsSource = items,
368
+
369
+ IndependentValuePath = "Key",
370
+
371
+ DependentValuePath = "Value",
372
+
373
+ Title = i
374
+
375
+ };
376
+
377
+
378
+
379
+ // SeriesにAdd
380
+
381
+ this.LineChart01.Series.Add(lineSeries);
382
+
383
+
384
+
385
+ i++;
386
+
387
+ }
388
+
389
+ }
390
+
391
+
392
+
393
+ // ボタンクリックでグラフのクリア
394
+
395
+ private void Button_Clear_Click(object sender, RoutedEventArgs e)
396
+
397
+ {
398
+
399
+ // SeriesのCollectionを初期化
400
+
401
+ this.LineChart01.Series.Clear();
402
+
403
+ }
404
+
405
+ }
406
+
407
+ }
408
+
409
+ ```
410
+
411
+
412
+
413
+ 次に、グラフ描画時間とメモリの測定です。
414
+
415
+ [1]. 本アプリをDebugモードで起動します。
416
+
417
+ [2]. 「グラフ生成」ボタン押下 → 「グラフクリア」ボタン押下 → 「グラフ生成」ボタン押下 → ・・・
418
+
419
+  と繰り返します。
420
+
421
+ [3]. この時の、各ボタンを押下してから処理が完了するまでの時間を、Debugモードの診断ツールのプロセスメモリグラフとCPUグラフの処理時間から読み取ります。
422
+
423
+
424
+
425
+ 測定結果が以下です。(1枚目がシステム起動時、2枚目が上記の[2].を5分間繰り返したときの画像です)
426
+
427
+ 赤丸の部分が、「グラフ生成」ボタンを押下してから、グラフが描画されるまでの時間で、
428
+
429
+ 青丸の部分が、「グラフクリア」ボタンを押下してから、グラフが消えるまでの時間です。
430
+
431
+
432
+
433
+ システム起動時
434
+
435
+ ![システム起動時](8b321d0ac570583cf22a6a3a885805b0.jpeg)
436
+
437
+ 5分経過時
438
+
439
+ ![5分経過時](aeba00b91768f40dd2994342a146e0bc.jpeg)
440
+
441
+
442
+
443
+ 上記のグラフから、以下のことが言えると考えました。
444
+
445
+ ・メモリは起動時には急激に増加し、それ以降は、徐々に増加していく。
446
+
447
+ ・処理時間は、グラフ描画時間はほとんど変わらないが、グラフクリアをする時間が5分経過時には、2倍近く遅くなっている。
448
+
449
+
450
+
451
+ とくに、処理時間が遅くなることが困っています。
452
+
453
+ アドバイス等ありましたらよろしくお願いします。