WP7 - 載入圖片速度比較

WP7 - 載入圖片速度比較

目前對於從IsolatedStorageFile裡存取圖片

我所知道的有幾種方法

儲存的方法有Extensions.SaveJpeg和IsolatedStorageFileStream.Write

載入的方法有Extensions.LoadJpeg和BitmapImage.SetSource

因為最近的APP必須大量存取IsolatedStorageFile裡的圖

所以做了一個效能測試

 

測試方法:

首先選擇一個圖片

然後儲存此圖到IsolatedStorage一百次~檔名用流水號

再從IsolatedStorage取得此一百張圖

最後全部刪除

時間計算就用簡單的DataTime來計算毫秒

 

第一種模式

使用Extensions.SaveJpeg 和 Extensions.LoadJpeg

程式碼片段如下

   1:  Result.Text += "Begin Mode 1\r\n";
   2:  using (var appStorage = IsolatedStorageFile.GetUserStoreForApplication()) {
   3:      DateTime start = DateTime.Now;
   4:      for (int i = 0; i < MaxCount; i++) {
   5:          using (var file = appStorage.OpenFile(string.Format("m1_{0}", i), System.IO.FileMode.OpenOrCreate)) {
   6:              image.SaveJpeg(file, image.PixelWidth, image.PixelHeight, 0, 75);
   7:              size += file.Length;
   8:          }
   9:      }
  10:      TimeSpan ts = DateTime.Now - start;
  11:      Result.Text += string.Format("Save MS={0} Size={1}\r\n", ts.TotalMilliseconds, size / MaxCount);
  12:      size = 0;
  13:      start = DateTime.Now;
  14:      for (int i = 0; i < MaxCount; i++) {
  15:          using (var file = appStorage.OpenFile(string.Format("m1_{0}", i), System.IO.FileMode.OpenOrCreate)) {
  16:              image.LoadJpeg(file);
  17:              size += file.Length;
  18:          }
  19:      }
  20:      ts = DateTime.Now - start;
  21:      Result.Text += string.Format("Load MS={0} Size={1}\r\n", ts.TotalMilliseconds, size / MaxCount);
  22:      start = DateTime.Now;
  23:      for (int i = 0; i < MaxCount; i++) {
  24:          appStorage.DeleteFile(string.Format("m1_{0}", i));
  25:      }
  26:      ts = DateTime.Now - start;
  27:      Result.Text += string.Format("Delete MS={0}\r\n", ts.TotalMilliseconds);
  28:  
  29:  }

 

第二種模式

使用IsolatedStorageFileStream.Write 和BitmapImage.SetSource

程式碼片段如下

   1:  Result.Text += "Begin mode 2\r\n";
   2:  using (var appStorage = IsolatedStorageFile.GetUserStoreForApplication()) {
   3:      DateTime start = DateTime.Now;
   4:      for (int i = 0; i < MaxCount; i++) {
   5:          using (var file = appStorage.OpenFile(string.Format("m2_{0}", i), System.IO.FileMode.OpenOrCreate)) {
   6:              byte[] bytes;
   7:              using (MemoryStream stream = new MemoryStream()) {
   8:                  image.SaveJpeg(stream, image.PixelWidth, image.PixelHeight, 0, 75);
   9:                  bytes = stream.ToArray();
  10:              }
  11:              file.Write(bytes, 0, bytes.Length);
  12:              size += file.Length;
  13:          }
  14:      }
  15:      TimeSpan ts = DateTime.Now - start;
  16:      Result.Text += string.Format("Save MS={0} Size={1}\r\n", ts.TotalMilliseconds, size / MaxCount);
  17:      size = 0;
  18:      start = DateTime.Now;
  19:      for (int i = 0; i < MaxCount; i++) {
  20:          using (var file = appStorage.OpenFile(string.Format("m2_{0}", i), System.IO.FileMode.OpenOrCreate)) {
  21:              BitmapImage bb = new BitmapImage();
  22:              bb.SetSource(file);
  23:              size += file.Length;
  24:          }
  25:      }
  26:      ts = DateTime.Now - start;
  27:      Result.Text += string.Format("Load MS={0} Size={1}\r\n", ts.TotalMilliseconds, size / MaxCount);
  28:      start = DateTime.Now;
  29:      for (int i = 0; i < MaxCount; i++) {
  30:          appStorage.DeleteFile(string.Format("m2_{0}", i));
  31:      }
  32:      ts = DateTime.Now - start;
  33:      Result.Text += string.Format("Delete MS={0}\r\n", ts.TotalMilliseconds);
  34:  }

 

第三種模式

和第一種一樣~但是載入的時候選擇比較小的SIZE

   1:  Result.Text += "Begin Mode 3\r\n";
   2:  using (var appStorage = IsolatedStorageFile.GetUserStoreForApplication()) {
   3:      DateTime start = DateTime.Now;
   4:      for (int i = 0; i < MaxCount; i++) {
   5:          using (var file = appStorage.OpenFile(string.Format("m3_{0}", i), System.IO.FileMode.OpenOrCreate)) {
   6:              image.SaveJpeg(file, image.PixelWidth, image.PixelHeight, 0, 75);
   7:              size += file.Length;
   8:          }
   9:      }
  10:      TimeSpan ts = DateTime.Now - start;
  11:      Result.Text += string.Format("Save MS={0} Size={1}\r\n", ts.TotalMilliseconds, size / MaxCount);
  12:      size = 0;
  13:      start = DateTime.Now;
  14:      for (int i = 0; i < MaxCount; i++) {
  15:          using (var file = appStorage.OpenFile(string.Format("m3_{0}", i), System.IO.FileMode.OpenOrCreate)) {
  16:              WriteableBitmap bit = new WriteableBitmap(150, 150);
  17:              bit.LoadJpeg(file);
  18:              size += file.Length;
  19:          }
  20:      }
  21:      ts = DateTime.Now - start;
  22:      Result.Text += string.Format("Load MS={0} Size={1}\r\n", ts.TotalMilliseconds, size / MaxCount);
  23:      start = DateTime.Now;
  24:      for (int i = 0; i < MaxCount; i++) {
  25:          appStorage.DeleteFile(string.Format("m3_{0}", i));
  26:      }
  27:      ts = DateTime.Now - start;
  28:      Result.Text += string.Format("Delete MS={0}\r\n", ts.TotalMilliseconds);
  29:  
  30:  }

 

接著是測試結果

M1    
Save Load Delete
14731 14337 349
14800 17437 398
16440 18838 489
17011 19886 506
15168 15497 398
平均    
15630 17199 428

 

M2    
Save Load Delete
14665 7197 361
13541 7028 391
14018 7054 407
15559 7023 402
13776 7034 400
平均    
14312 7067 392.2

 

M3    
Save Load Delete
14674 15115 343
14218 11323 400
14558 12555 403
15738 16345 409
19552 17785 413
平均    
15748 14625 393.6

 

上面每個數據都是用HD7實機測試~OS:7.0.7008.0

單位都是毫秒

可以看的出來M2的儲存方式雖然是先用Extensions.SaveJpeg存到Memory裡再用IsolatedStorageFile.Write

卻還是比直接用Extensions.SaveJpeg還要快~雖然只快一點

而差異比較大的是Extensions.LoadJpeg 和 BitmapImage.SetSource

幾乎差了一倍的效能

而載入的時候把圖縮小是有提升些許效能的

 

雖然Extensions.LoadJpeg 和 BitmapImage.SetSource效能差一倍

但是Extensions.LoadJpeg 可以在非主執行續使用

BitmapImage.SetSource就一定要在主執行續使用

 

 

但是~~效能還是比不上Pucture Hub載入圖片的速度啊!