当前位置:湖北活动 > 综合信息 > 杂文 > > 正文

Windows Phone本地数据库性能最佳实践

发布时间:2019-03-04    点击次数:

 

Windows Phone本地数据库机能最佳实践

  【技巧】本地数据库最佳实践。将从三个方面来评论辩论若何改良wp数据库应用在速度及内存消费方面的机能。不仅要改良法度榜样的机能并且要量化到具体改良了若干。

  关于提升应用机能最重要的技巧是:

  在实体类中定义版本列 ColumnAttribute.IsVersion

  在实体类中实现INotifyPropertyChanging

  应用编译查询

  起首,建立一个WP7.1应用。起首创建一个测试设置,这将是我们的测试和测量基准线。我们将应用下面的类,不做任何改良,作为本地数据库的机能测试基准:

  public class PersonSimple : IPerson

  {

  [Column(IsPrimaryKey = true, IsDbGenerated = true)]

  public int ID

  {

  get;

  set;

  }

  [Column(CanBeNull = false)]

  public string FirstName

  {

  get;

  set;

  }

  [Column(CanBeNull = false)]

  public string LastName

  {

  get;

  set;

  }

  [Column(CanBeNull = false)]

  public int Age

  {

  get;

  set;

  }

  [Column(CanBeNull = true)]

  public string Address

  {

  get;

  set;

  }

  [Column(CanBeNull = true)]

  public string Email

  {

  get;

  set;

  }

  [Column(CanBeNull = true)]

  public string WebSite

  {

  get;

  set;

  }

  }

  我们应用 IPerson 接口,经由过程同样的泛型代码来测试不合版本Person类

  public interface IPerson

  {

  string FirstName { get; set; }mysql教程是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

  string LastName { get; set; }

  int Age { get; set; }

  string Address { get; set; }

  string Email { get; set; }

  string WebSite { get; set; }

  }

  除 PersonSimple 测试设置还包含:

  1. 下面两个加强版本

  PersonVersioned: with added an additional version column(含版本列)

  PersonOptimized: with version column and implemented INotifyPropertyChanging (包含版本列并且实现INotifyPropertyChanging)

  2. 对于上述三类Person,分别对应数据库中三个自力的表,分别被初始化存放10000笔记录

  3. (为了测试版本列及INotifyPropertyChanging,分别更改第50行记录的FirstName和LastName。泛型办法如下)

  private long UpdatePersonEntities(Func> getCollection) where T : class, IPerson, new()

  {

  long elapsedMilliseconds;

  using (PersonDataContext context = new PersonDataContext(ConnectionString))

  {

  Table collection = getCollection(context);

  List personList = collection.ToList();

  int count = personList.Count;

  for (int i = 0; i < count; i++)

  {

  if ((i % 50) != 0)

  {

  continue;

  }

  IPerson person = personList[i];

  person.FirstName = string.Concat(person.FirstName, "changed");

  person.LastName = string.Concat(person.LastName, "changed");

  //person.Age = person.Age + 1;

  //person.Address = string.Concat(person.Address, "changed");

  //person.Email = string.Concat(person.Email, "changed");

  //person.WebSite = string.Concat(person.WebSite, "changed");

  }

  Debug.WriteLine("Update {0} entities...", count);

  Stopwatch stopwatch = Stopwatch.StartNew();

  // save changes to the database

  context.SubmitChanges();

  stopwatch.Stop();

  elapsedMilliseconds = stopwatch.ElapsedMilliseconds;

  Debug.WriteLine("Time elapsed: {0} ms", elapsedMilliseconds);

  }

  return elapsedMilliseconds;

  }

  总之,这种办法试图重现这两种技巧的机能改进的情况。

  这种优化是关于Windows Phone 的 LINQ To SQL

  public class PersonVersioned : IPerson

  {

  [Column(IsVersion = true)]

  private Binary version;

  // More code here...

  }

  本优化可以对年夜量数据更新产生机能改进。

        经由过程保护一个实例的两个副本跟踪变更。一个副本表示从数据库中掏出后的原始状况,另一个表示应用法度榜样的操作更改。当更改被提交到数据库时,LINQ to SQL可以断定哪些已经被更新,并且仅更新哪些产生改变的。

  默认情况下,LINQ to SQL为属性创建两个副本。然而,平日情况下,只有集合中的少数对象会在特定操作中被修改。是以,就没须要再保存第二个副本了。

  可以使法度榜样修改属性时通知DataContext。DataContext可以像触发器一样应用这些通知创建副本。如许,只有产生更改的属性须要第二个副本,这将削减内存占用

  public class PersonOptimized : IPerson, INotifyPropertyChanging

  {

  private int id;

  private string firstName;

  private string lastName;

  private int age;

  private string address;

  private string email;

  private string webSite;

  [Column(IsVersion = true)]

  private Binary version;

  [Column(IsPrimaryKey = true, IsDbGenerated = true)]

  public int ID

  {

  get

  {

  return this.id;

  }

  set

  {

  if (this.id != value)

  {

  this.OnPropertyChanging("ID");

  this.id = value;

  }

  }

  }

  //...

  //More code...

  }

  测试成果:

  PersonSimple:

  更新前内存应用:11560 KB

  更新后内存应用:22092 KB

  更新应用内存: 10532 KB

  更新耗时: 2082 ms

  PersonVersioned:

  更新前内存应用:12580 KB

  更新后内存应用:20244 KB

  更新应用内存: 7664 KB

  更新耗时: 1278 ms

  PersonOptimized:

  更新前内存应用:12932 K

  更新后内存应用:B16264 KB

  更新应用内存: 3332 KB

  更新耗时: 326 ms

  Compiled Query Tests

  What is Compiled Query?

  默认情况下,查询履行时LINQ to SQL将LINQ表达式树翻译为对应的T-SQL语句,对于经常履行的查询(例如,根据ID查找响应记录),每次生成响应的T-SQL的开销是异常浪费的。为了避免这种低效,可以应用编译查询。编译查询提前生成带参数的T-SQL语句,然后可以带入不合的参数值重用已生成的T-SQL语句。

  private void btnTestCompiledQuery_Click(object sender, RoutedEventArgs e)

  {

  Func> getPeopleByAddress =

  CompiledQuery.Compile((PersonDataContext context, string addressQuery, int age) =>

  from p in context.PeopleSimple where p.Address.Contains(addressQuery) && p.Age > age select p);

  int count = 100;

  long millisecondsCompiled;

  long millisecondsQuery;

  using (PersonDataContext context = new PersonDataContext(ConnectionString))

  {

  Debug.WriteLine("Start compiled query test...");

  Stopwatch stopwatch = Stopwatch.StartNew();

  for (int i = 0; i < count; i++)

  {

  var peopleByAddressQuery = getPeopleByAddress(context, i.ToString(), i);

  //execute query

  PersonSimple personByAddress = peopleByAddressQuery.FirstOrDefault();

  }

  stopwatch.Stop();

  millisecondsCompiled = stopwatch.ElapsedMilliseconds;

  Debug.WriteLine("Time elapsed: {0} ms", millisecondsCompiled);

  Debug.WriteLine("Start normal query test...");

  stopwatch = Stopwatch.StartNew();

  for (int i = 0; i < count; i++)

  {

  var peopleByAddressQuery = from p in context.PeopleSimple where p.Address.Contains(i.ToString()) && p.Age > i select p;

  //execute query

  PersonSimple personByAddress = peopleBoracle培训全称为Oracle Workforce Development Program,是Oracle (甲骨文)公司专门面向学生、个人、在职人员等群体开设的职业发展力课程yAddressQuery.FirstOrDefault();

  }

  stopwatch.Stop();

  millisecondsQuery = stopwatch.ElapsedMilliseconds;

  Debug.WriteLine("Time elapsed: {0} ms", millisecondsQuery);

  }

  StringBuilder messageBuilder = new StringBuilder();

  messageBuilder.AppendFormat("Get people by age normal: {0} ms", millisecondsQuery).AppendLine();

  messageBuilder.AppendFormat("Get people by age compiled: {0} ms", millisecondsCompiled).AppendLine();

  MessageBox.Show(messageBuilder.ToString());

  }

  stopwatch.Stop();

  millisecondsQuery = stopwatch.ElapsedMilliseconds;

  Debug.WriteLine("Time elapsed: {0} ms", millisecondsQuery);

  }

  StringBuilder messageBuilder = new StringBuilder();

  messageBuilder.AppendFormat("Get people by age normal: {0} ms", millisecondsQuery).AppendLine();

  messageBuilder.AppendFormat("Get people by age compiled: {0} ms", millisecondsCompiled).AppendLine();

  MessageBox.Show(messageBuilder.ToString());

  }

  查询成果

  非编译查询耗时: 701 ms

  编译查询耗时: 501 ms

  Conclusion

  总之,我们已经证实,所有这三种办法明显进步机能。我们甚至惊喜,只需添加一个版本列就有30%阁下的内存应用率改良以及40%的速度提升 。

  Here are the results for the version column and INotifyPropertyChanging techniques combined in a chart:

http://www.fgedu.net.cn

  Windows Phone本地数据库性能最佳实践》相关内容:

  微领地网络赋能本地生活服务商家,加速行业变革

缘定迈欧,健你倾心 武汉大型交友活动

  七夕脱单直通车 | 新颖玩法、精准匹配、超多优质单身男女。通读全文,了解活动 1.报名时间及方式 即日起-8...

2018全球投资峰会!解读新时代中国经济脉搏

  近年来,全球金融服务持续创新发展,中国金融市场也经历了翻天覆地变化。面对如此巨变的金融市场,是机遇还...

2018武汉园博园灯会开放时间、交通、门票,免费人群有哪些

  2018武汉园博园第三届灯会就要开始了,时间,交通,门票都在这里,感兴趣的小伙伴赶紧看! 2018武汉园博园灯...

2018第七届中国(武汉)国际焙烤展览会 第五届武汉咖啡文化节

  展会日期 : 2018-04-13 至 2018-04-15 联系人 : 金鑫 活动城市 : 武汉 联系电话 : 18600335017 活动地址 : ...

RUN潮4.0 线上跑 | 不计较输赢,只在乎前行

  你跑步的初衷是什么? 三年前,作为一个160cm,62kg的女壮士来说,什么跑步能净化灵魂、强身健体、陶冶性情,...

消费者口味生变 压榨行业承压 豆油调和油先后“失守”

  豆油遇冷花生油热?中国的食用油市场消费口味变化大。本报记者获悉,豆油、调和油先后失守,花生油、葵花籽...

万科成全球房企市值冠军 万科总市值已达到3878亿元

  从全球房企市值排名来看,万科已经成为全球房企市值冠军。数据显示,万科总市值已经达到3878亿元。排名第二...

企业年金办法下月起施行 将给劳动者带来哪些影响?

  人社部、财政部日前联合印发《企业年金办法》(以下简称《办法》),将于今年2月1日起施行。 企业年金,即企...

轨交5A线今年开工建设 重庆将新增两座长江大桥

  轨交5A线今年开工建设 近日,记者了解到,轨道交通5A线、黄桷坪过江通道、白市驿隧道等11个项目将开工建设...

斗鱼直播回应上市传闻:有IPO的计划 目前仍在筹备中

  1月13日,斗鱼直播平台举办鱼乐盛典颁奖典礼。典礼上,斗鱼宣布将在2018年投入10亿元用于培养优秀主播,打...

宜昌和平公园在哪?如何搭乘公交车前往,和平公园交通指南

  宜昌国际马拉松比赛起点设在和平公园,如何搭乘公交车前往和平公园呢?小编已经整理好了,希望能够帮到您! ...

2017宜昌暑假清江画廊旅游游玩攻略:票价、交通指南、优惠政策

  暑假快到了,漫长暑假该去哪里玩?宜昌吃喝玩乐小编为您整理了2017宜昌暑假清江画廊旅游游玩攻略,要玩水?要...

武汉周边最美的湖泊之一东湖介绍,东湖在哪?

  东湖 东湖暂让西湖好,将来定比西湖强东湖的美丽是动人的,它以秀丽的湖光山色和优美恬静的自然环境及广阔...

武汉周边最美的湖泊之一金银湖介绍,金银湖在哪?

  金银湖 流光溢彩的湿地公园金银湖有着得天独厚的优势,2000亩水域面积,42000米湖岸线,东流港、黄狮海、潇...

武汉周边最美的湖泊之一月湖介绍,月湖在哪?

  月湖 悠悠深远的文化底蕴因月而得名的月湖,最为著名的伯牙遇知音子期的历史故事,给后人留下了丰富的知音...

分手后藕断丝连是什么情况?

   分手后藕断丝连是什么情况? 分手后藕断丝连是什么情况? 不少小情侣分手后老是藕断丝连,这...

绿色环保:“绿色消费”就是环保时尚

   消费时选择购买节能、可循环利用和环保产品,就是把你手中的钞票变成选票投给了绿色产业。消费中,尽量食...

轮椅的清洁与保养-轮椅的选购技巧

   轮椅的清洁与保养-轮椅的选购技巧 轮椅的选购知识 1、性能。轮椅的性能有: 如最大速度...

孕妇吃蕨菜有哪些益处?孕妇吃蕨菜的制作方法

   蕨菜营养丰盛,与栽培蔬菜比较,蛋白质高20%,矿物质达数十种之多且含量高。不少懂得一些养生保健知识的人...

玄关风水如何设计?玄关应该保持整洁

   玄关风水如何设计?玄关应该保持整洁 玄关风水如何设计? 玄关一般被我们用来调整家居环境,...

热点图文