LINQ to Sql系列四 性能优化总结
Linq to sql 是一个代码生成器和ORM工具,他自动为我们做了很多事情,这很容易让我们对他的性能产生怀疑。但是也有几个测试证明显示在做好优化的情况下,linq to sql的性能可以提升到ado.net datareader性能的93%。 因此我总结了Linq to sql的10个性能提升点
Linq to sql 是一个代码生成器和ORM工具,他自动为我们做了很多事情,这很容易让我们对他的性能产生怀疑。但是也有几个测试证明显示在做好优化的情况下,linq to sql的性能可以提升到ado.net datareader性能的93%。
因此我总结了Linq to sql的10个性能提升点,来优化其查询和修改的性能。
1. 不需要时要关闭 DataContext的ObjectTrackingEnabled 属性
using (NorthwindDataContext db= new NorthwindDataContext()) { db.ObjectTrackingEnabled = false; }
关闭这个属性会使linq to sql停止对对象的标识管理和变化跟踪。但值得注意的是关闭ObjectTrackingEnabled 意味着也将DeferredLoadingEnabled属性设置为false,当访问相关表时会返回null。
2. 不要把所有的数据对象都拖到一个DataContext中
一个DataContext代表一个工作单元,并非整个数据库。如果几个数据库对象之间没有关系,香港服务器,或者在程序中用不到的数据库对象(例如日志表,香港服务器,批量操作表等等),让这些对象消耗内存空间和DataContext对象跟踪服务是完全没有必要的。
建议将所有的数据库对象按工作单元分给几个DataContext来处理。你也可以通过构造函数配置这些DataContext使用相同的数据库连接,这样也可以发挥据库连接池的用途。
3. CompiledQuery --- 有必要就得用
在创建一个linq to sql表达式并将它转换成对应的sql语句执行的过程,需要几个关键的步骤
1) 创建表达式树
2) 转换成sql
3) 运行sql语句
4) 取回数据
5) 将数据转换成对象
很显然,当我们一遍又一遍的执行相同的查询时,上面1),2)两个步骤重复执行是在浪费时间。使用System.Data.Linq命名空间下的CompiledQuery类的Compile方法可以避免这种浪费。
请看下面的使用示例:
Func
func变量现在是一个已经编译后的查询,他只需要在第一次运行时编译一次,就可以重复使用,香港虚拟主机,现在我们将其存储到一个静态类中,如下所示:
Utility class to store compiled queries
QueriesUtility
{
Gets the query that returns categories with more than five products.
Func
如何使用它呢,请看下面的代码片段:
using (NorthwindDataContext context = new NorthwindDataContext()) { QueriesUtility.GetCategoriesWithMoreThanFiveProducts(context); }
4. 使用DataLoadOptions.AssociateWith设置仅从数据库中取需要的数据
5. 仅在需要时打开积极并发控制,换句话说如果不需要请将列的UpdateCheck属性设置为UpdateCheck.Never,这样在更新和删除时可以减少不必要的条件判断
[Column(Storage=“_Description”, DbType=“NText”, UpdateCheck=UpdateCheck.Never)] public string Description { get { return this._Description; } set { if ((this._Description != value)) { this.OnDescriptionChanging(value); this.SendPropertyChanging(); this._Description = value; this.SendPropertyChanged(“Description”); this.OnDescriptionChanged(); } } }
6. 经常设置DataContext.Log查看linq to sql执行时使用的sql,分析取回的数据是否刚好够用
using (NorthwindDataContext context = new NorthwindDataContext()) { context.Log = Console.Out; }
7. 仅在有必要时使用Attach方法
在linq to sql中对象附加是一个的非常好用的机制,但是什么事情都不是免费的。当在DataContext中Attach对象时,就意味着过一段时间你会使用这个对象,DataContext会给这个对象做“马上要做修改的”标记。
但是有时候Attach并非必要,例如使用AttachAll去附加一个集合,这个集合中的元素并非都会发生变化。
8. 注意实体标识管理的开销
在一个非只读的DataContext中,对象一直会被跟踪,因此要知道在非直觉的情况下也可能会导致DataContext做对象跟踪,请看下面的代码:
using (NorthwindDataContext context = new NorthwindDataContext()) { var a = from c in context.Categories select c; }
非常简单,就是一个最基本的linq查询,让我们再看下另一个语句using (NorthwindDataContext context = new NorthwindDataContext()) { var a = from c in context.Categories select new Category { CategoryID = c.CategoryID, CategoryName = c.CategoryName, Description = c.Description }; }

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Siri Xiaomi Mi 15 dijangka akan dikeluarkan secara rasmi pada bulan Oktober, dan nama kod siri penuhnya telah didedahkan dalam pangkalan kod MiCode media asing. Antaranya, perdana Xiaomi Mi 15 Ultra diberi nama kod "Xuanyuan" (bermaksud "Xuanyuan"). Nama ini berasal daripada Maharaja Kuning dalam mitologi Cina, yang melambangkan bangsawan. Xiaomi 15 diberi nama kod "Dada", manakala Xiaomi 15Pro dinamakan "Haotian" (bermaksud "Haotian"). Nama kod dalaman Xiaomi Mi 15S Pro ialah "dijun", yang merujuk kepada Maharaja Jun, tuhan pencipta "The Classic of Mountains and Seas". Sarung siri Xiaomi 15Ultra

Perbandingan prestasi rangka kerja Java yang berbeza: Pemprosesan permintaan REST API: Vert.x adalah yang terbaik, dengan kadar permintaan 2 kali SpringBoot dan 3 kali Dropwizard. Pertanyaan pangkalan data: HibernateORM SpringBoot adalah lebih baik daripada Vert.x dan ORM Dropwizard. Operasi caching: Pelanggan Hazelcast Vert.x lebih unggul daripada mekanisme caching SpringBoot dan Dropwizard. Rangka kerja yang sesuai: Pilih mengikut keperluan aplikasi Vert.x sesuai untuk perkhidmatan web berprestasi tinggi, SpringBoot sesuai untuk aplikasi intensif data, dan Dropwizard sesuai untuk seni bina perkhidmatan mikro.

Perbandingan prestasi kaedah membalik nilai kunci tatasusunan PHP menunjukkan bahawa fungsi array_flip() berprestasi lebih baik daripada gelung for dalam tatasusunan besar (lebih daripada 1 juta elemen) dan mengambil masa yang lebih singkat. Kaedah gelung untuk membalikkan nilai kunci secara manual mengambil masa yang agak lama.

Kerumitan masa mengukur masa pelaksanaan algoritma berbanding saiz input. Petua untuk mengurangkan kerumitan masa program C++ termasuk: memilih bekas yang sesuai (seperti vektor, senarai) untuk mengoptimumkan storan dan pengurusan data. Gunakan algoritma yang cekap seperti isihan pantas untuk mengurangkan masa pengiraan. Hapuskan berbilang operasi untuk mengurangkan pengiraan berganda. Gunakan cawangan bersyarat untuk mengelakkan pengiraan yang tidak perlu. Optimumkan carian linear dengan menggunakan algoritma yang lebih pantas seperti carian binari.

Sejak siri Huawei Mate60 mula dijual tahun lepas, saya secara peribadi telah menggunakan Mate60Pro sebagai telefon utama saya. Dalam hampir setahun, Huawei Mate60Pro telah melalui pelbagai peningkatan OTA, dan keseluruhan pengalaman telah dipertingkatkan dengan ketara, memberikan orang perasaan sentiasa baharu. Sebagai contoh, baru-baru ini, siri Huawei Mate60 sekali lagi menerima peningkatan besar dalam keupayaan pengimejan. Yang pertama ialah fungsi penghapusan AI baharu, yang boleh menghapuskan orang yang lalu-lalang dan serpihan secara bijak dan mengisi kawasan kosong secara automatik, kedua, ketepatan warna dan kejelasan telefoto kamera utama telah dinaik taraf dengan ketara. Memandangkan ia adalah musim kembali ke sekolah, siri Huawei Mate60 juga telah melancarkan promosi musim luruh: anda boleh menikmati diskaun sehingga 800 yuan apabila membeli telefon, dan harga permulaan serendah 4,999 yuan. Produk yang biasa digunakan dan selalunya baru dengan nilai yang hebat

Teknik berkesan untuk mengoptimumkan prestasi berbilang benang C++ termasuk mengehadkan bilangan utas untuk mengelakkan perbalahan sumber. Gunakan kunci mutex ringan untuk mengurangkan perbalahan. Optimumkan skop kunci dan minimumkan masa menunggu. Gunakan struktur data tanpa kunci untuk menambah baik keselarasan. Elakkan sibuk menunggu dan maklumkan urutan ketersediaan sumber melalui acara.

Apabila membangunkan aplikasi berprestasi tinggi, C++ mengatasi bahasa lain, terutamanya dalam penanda aras mikro. Dalam penanda aras makro, kemudahan dan mekanisme pengoptimuman bahasa lain seperti Java dan C# mungkin berprestasi lebih baik. Dalam kes praktikal, C++ berprestasi baik dalam pemprosesan imej, pengiraan berangka dan pembangunan permainan, dan kawalan langsungnya terhadap pengurusan memori dan akses perkakasan membawa kelebihan prestasi yang jelas.

Dalam PHP, penukaran tatasusunan kepada objek akan memberi kesan pada prestasi, yang dipengaruhi terutamanya oleh faktor seperti saiz tatasusunan, kerumitan dan kelas objek. Untuk mengoptimumkan prestasi, pertimbangkan untuk menggunakan iterator tersuai, mengelakkan penukaran yang tidak perlu, tatasusunan penukaran kelompok dan teknik lain.
