不卡视频在线观看_三级网站视频在线观看_91精品网站_国产综合一区二区

完善主體資料,免費贈送VIP會員!
* 主體類型
* 企業名稱
* 信用代碼
* 所在行業
* 企業規模
* 所在職位
* 姓名
* 所在行業
* 學歷
* 工作性質
請先選擇行業
您還可以選擇以下福利:
行業福利,領完即止!

下載app免費領取會員

NULL

ad.jpg

二次開發教程:orm 里使用Emit

發布于:2019-07-24 16:33:26

網友投稿

更多

比較一下Emit的賦值,反射賦值和直接賦值的效率


namespace Assignment

{

    class Program

    {

        static SQLiteConnection conn;

        static string dbStr = "test.db";

        static void Main(string[] args)

        {

            CreateDB();

            List<Book> books = new List<Book>();

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

            {

                books.Add(new Book());

            }

            Insert(books);

            Insert(new Book());

 

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            var bs = Query<Book>();

            stopwatch.Stop();

            Console.WriteLine(stopwatch.ElapsedMilliseconds);

 

            stopwatch.Restart();

            var bs1 = QueryEmit<Book>();

            stopwatch.Stop();

            Console.WriteLine(stopwatch.ElapsedMilliseconds);

 

            stopwatch.Restart();

            var bs2 = Query();

            stopwatch.Stop();

            Console.WriteLine(stopwatch.ElapsedMilliseconds);

 

            Console.ReadLine();

        }

 

        static void CreateDB()

        {

            SQLiteConnection.CreateFile(dbStr);

            conn = new SQLiteConnection($"Data Source={dbStr};Version=3;");

            conn.Open();

 

            string sql = "create table book (id int,name varchar(20), price double)";

            SQLiteCommand command = new SQLiteCommand(sql, conn);

            command.ExecuteNonQuery();

        }

        static void Insert(Book book)

        {

            string sql = "insert into book values(@id,@name,@price)";

            SQLiteCommand command = new SQLiteCommand(sql, conn);

            command.Parameters.AddWithValue("id", book.Id);

            command.Parameters.AddWithValue("name", book.Name);

            command.Parameters.AddWithValue("price", book.Price);

 

            command.ExecuteNonQuery();

        }

        static void Insert(IList<Book> books)

        {

            string sql = "insert into book values(@id,@name,@price)";

            var trans = conn.BeginTransaction();

            SQLiteCommand command = new SQLiteCommand(sql, conn, trans);

            foreach (var book in books)

            {

                command.Parameters.Clear();

                command.Parameters.AddWithValue("id", book.Id);

                command.Parameters.AddWithValue("name", book.Name);

                command.Parameters.AddWithValue("price", book.Price);

 

                command.ExecuteNonQuery();

            }

            trans.Commit();

        }

 

        static List<Book> Query()

        {

            List<Book> result = new List<Book>();

            string sql = "select * from book";

            SQLiteCommand command = new SQLiteCommand(sql, conn);

            var reader = command.ExecuteReader();

            while (reader.Read())

            {

                Book book = new Book();

                book.Id = (int)reader.GetValue(0);

                book.Name = (string)reader.GetValue(1);

                book.Price = (double)reader.GetValue(2);

                result.Add(book);

            }

            return result;

        }

 

        static List<T> Query<T>()

        {

            List<T> result = new List<T>();

            string sql = "select * from book";

            SQLiteCommand command = new SQLiteCommand(sql, conn);

            Type type = typeof(T);

            var reader = command.ExecuteReader();

            var readerMap = new ReaderMap(reader);

            var propertyMap = new PropertyMap(readerMap, type);

            while (reader.Read())

            {

                T r = (T)Activator.CreateInstance(type);

                int len = reader.FieldCount;

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

                {

                    propertyMap[i].SetValue(r, reader.GetValue(i));

                }

                result.Add(r);

            }

 

            return result;

        }

        

        static List<T> QueryEmit<T>()

        {

            Type type = typeof(T);

 

            List<T> result = new List<T>();

            string sql = "select * from book";

            SQLiteCommand command = new SQLiteCommand(sql, conn);

            var reader = command.ExecuteReader();

            var readerMap = new ReaderMap(reader);

            var propertyMap = new PropertyMap(readerMap, type);

 

            var func = GetSetter<T>(reader, propertyMap);

 

            while (reader.Read())

            {

                T r = (T)func(reader);

                result.Add(r);

            }

 

            return result;

        }

 

        static Func<SQLiteDataReader, object> GetSetter<T>(SQLiteDataReader reader, PropertyMap map)

        {

            Type bookType = typeof(T);

            var constructor = bookType.GetConstructors().FirstOrDefault();

            DynamicMethod setter = new DynamicMethod("setbook", bookType, new Type[] { typeof(SQLiteDataReader) });

            setter.DefineParameter(0, ParameterAttributes.In, "reader");

 

            var iLGenerator = setter.GetILGenerator();

 

            iLGenerator.DeclareLocal(bookType); //Ldloc_0 book

            iLGenerator.DeclareLocal(typeof(object));//Ldloc_1 reader.GetValue

 

            iLGenerator.Emit(OpCodes.Nop);

            iLGenerator.Emit(OpCodes.Newobj, constructor);

            iLGenerator.Emit(OpCodes.Stloc_0);

            iLGenerator.Emit(OpCodes.Nop);

 

            var getM = typeof(DbDataReader).GetMethod("GetValue");

 

            int len = map.Count;

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

            {

                ///讀數據

                iLGenerator.Emit(OpCodes.Ldarg_0);

                iLGenerator.Emit(OpCodes.Ldc_I4, i);

                iLGenerator.Emit(OpCodes.Callvirt, getM);

                iLGenerator.Emit(OpCodes.Stloc_1);

                iLGenerator.Emit(OpCodes.Nop);

 

                var tp = map[i];

                iLGenerator.Emit(OpCodes.Ldloc_0);

                iLGenerator.Emit(OpCodes.Ldloc_1);

                if (tp.PropertyType.IsValueType)

                    iLGenerator.Emit(OpCodes.Unbox_Any, tp.PropertyType);

                else

                    iLGenerator.Emit(OpCodes.Castclass, tp.PropertyType);

 

                var mt = tp.GetSetMethod();

 

                iLGenerator.Emit(OpCodes.Callvirt, mt);

                iLGenerator.Emit(OpCodes.Nop);

            }

 

            iLGenerator.Emit(OpCodes.Ldloc_0);

            iLGenerator.Emit(OpCodes.Ret);

 

            return (Func<SQLiteDataReader, object>)setter.CreateDelegate(typeof(Func<SQLiteDataReader,object>));

        }

 

        static Book QueryBook(SQLiteDataReader reader)

        {

            Book book = new Book();

            book.Id = (int)reader.GetValue(0);

            book.Name = (string)reader.GetValue(1);

            book.Price = (double)reader.GetValue(2);

            return book;

        }

    }

    public class PropertyMap

    {

        private PropertyInfo[] properties = null;

        public PropertyMap(ReaderMap readerMap,Type type)

        {

            int len = readerMap.Count;

            Count = len;

            var ps = type.GetProperties();

            properties = new PropertyInfo[len];

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

            {

                var readerItem = readerMap[i];

                var tp = ps.FirstOrDefault(p => p.Name.ToUpper() == readerItem.Name.ToUpper());

                if (tp != null)

                {

                    if (tp.PropertyType.IsAssignableFrom(readerItem.Type))

                    {

                        properties[i] = tp;

                    }

                }                

            }

        }

        public PropertyInfo this[int i]

        {

            get

            {

                return properties[i];

            }

        }

        public int Count { get; private set; }

    }

    public class ReaderMap

    {

        private ReaderItem[] items = null; 

        public ReaderMap(SQLiteDataReader reader)

        {

            int len = reader.FieldCount;

            Count = len;

            items = new ReaderItem[len];

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

            {

                items[i] = new ReaderItem

                {

                    Id = i,

                    Name = reader.GetName(i),

                    Type = reader.GetFieldType(i)

                };

            }

        }

        public int Count

        {

            get;

            private set;

        }

        public ReaderItem this[int i]

        {

            get

            {

                return items[i];

            }

        }

    }

    public class ReaderItem

    {

        public int Id { get; set; }

        public string Name { get; set; }

        public Type Type { get; set; }

    }

    public class Book

    {

        public int Id { get; set; }

        public string Name { get; set; }

        public double Price { get; set; }

        public Book()

        {

            Id = 0;

            Name = "Name";

            Price = 11.9;

        }

 

        public override string ToString()

        {

            return $"Id; {Id}\tName: {Name}\tPrice: {Price}";

        }

    }

}

輸出結果為


反射時間2725


Emit 時間1745


直接賦值1604

本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。

未標題-1.jpg

上一篇:二次開發教程:Dapper里使用Attribute自定義映射關系

下一篇:二次開發教程:Emit 循環

60acb4e0ef112.png
不卡视频在线观看_三级网站视频在线观看_91精品网站_国产综合一区二区

      9000px;">

          欧美日韩中文精品| 激情六月婷婷久久| 中文字幕在线一区免费| 欧美一级高清大全免费观看| 欧美性猛片aaaaaaa做受| 成人综合在线观看| 成人性生交大片免费看视频在线 | 国产精品久久影院| 中文字幕的久久| 中文一区二区完整视频在线观看| 国产性天天综合网| 国产日韩欧美制服另类| 中文字幕精品综合| 亚洲精品视频在线观看网站| 亚洲超碰精品一区二区| 天天影视涩香欲综合网| 日本成人中文字幕在线视频| 老色鬼精品视频在线观看播放| 久久精品国产一区二区三区免费看| 日韩电影在线观看电影| 国产精品自拍毛片| 成年人国产精品| 色噜噜狠狠成人中文综合 | 日韩电影在线观看一区| 老汉av免费一区二区三区| 国产一区在线观看视频| 国产69精品久久久久毛片| 99精品久久免费看蜜臀剧情介绍 | 天天色天天操综合| 狠狠色丁香九九婷婷综合五月| 国产乱子伦视频一区二区三区| 成人污视频在线观看| 在线视频国内一区二区| 欧美一三区三区四区免费在线看| 日韩欧美精品三级| 亚洲欧美在线观看| 日本va欧美va精品发布| 波多野结衣亚洲| 制服丝袜日韩国产| 久久久久久久av麻豆果冻| 亚洲丝袜精品丝袜在线| 久久精品国产一区二区| 91在线观看一区二区| 欧美一区二区在线观看| 中文字幕一区二区三区蜜月| 日韩电影在线一区二区三区| 成人精品一区二区三区四区| 欧美一区二区网站| 国产精品久久精品日日| 激情综合色播五月| 欧洲亚洲精品在线| 中文字幕精品一区二区精品绿巨人| 午夜天堂影视香蕉久久| av一区二区三区| 久久亚洲精精品中文字幕早川悠里| 一区二区三区日韩欧美精品| 高清在线不卡av| 欧美大肚乱孕交hd孕妇| 一区二区视频免费在线观看| 成人蜜臀av电影| 欧美岛国在线观看| 肉丝袜脚交视频一区二区| 91老师片黄在线观看| 国产欧美1区2区3区| 久久99久久久欧美国产| 欧美精品777| 一区二区三区免费| 成人高清免费观看| 久久蜜桃一区二区| 精久久久久久久久久久| 欧美一区二区三区小说| 日韩精品乱码av一区二区| 欧美影视一区二区三区| 一区二区三区在线视频免费| 99国产精品国产精品久久| 国产农村妇女精品| 成人av在线资源网站| 国产精品美日韩| 国产成人精品影视| 国产精品麻豆视频| 国产东北露脸精品视频| 日本一区二区视频在线观看| 国产一区二区免费看| 国产偷国产偷精品高清尤物| 国产999精品久久久久久绿帽| 久久久亚洲综合| 高清国产一区二区| 国产精品剧情在线亚洲| 91高清在线观看| 亚洲午夜视频在线| 日韩欧美一级二级| 国产成人亚洲精品狼色在线| 中文字幕精品一区| 91在线观看视频| 舔着乳尖日韩一区| 精品国产一二三区| av综合在线播放| 亚洲不卡av一区二区三区| 911精品国产一区二区在线| 极品美女销魂一区二区三区免费| 国产清纯在线一区二区www| 一本色道久久综合亚洲aⅴ蜜桃| 亚瑟在线精品视频| 久久婷婷色综合| 色综合久久66| 久久成人免费电影| 亚洲欧洲成人自拍| 欧美www视频| av在线不卡免费看| 日本不卡一二三区黄网| 日本一二三四高清不卡| 色婷婷精品久久二区二区蜜臂av | 亚洲综合偷拍欧美一区色| 欧美一区二区三区影视| caoporn国产精品| 看片的网站亚洲| 亚洲男女毛片无遮挡| 日韩欧美aaaaaa| 99精品视频免费在线观看| 日欧美一区二区| 日韩美女啊v在线免费观看| 欧美精品丝袜久久久中文字幕| 成人免费视频caoporn| 男女男精品视频网| 亚洲国产精品v| 欧美一级日韩一级| 色88888久久久久久影院野外| 国产成人精品午夜视频免费| 三级久久三级久久久| 夜夜嗨av一区二区三区四季av| 精品成人一区二区三区四区| 欧美日韩aaaaaa| 色欧美日韩亚洲| 不卡的av中国片| 国产在线不卡视频| 看国产成人h片视频| 日韩福利电影在线| 亚洲一二三级电影| 亚洲综合色网站| 中文字幕一区免费在线观看| 久久九九久久九九| 久久婷婷综合激情| 国产亚洲综合在线| 久久一区二区三区四区| 精品区一区二区| 日韩欧美一区在线| 日韩欧美一区电影| 日韩一区二区免费在线观看| 制服丝袜亚洲色图| 欧美一区二区三区在线| 色噜噜偷拍精品综合在线| 波多野结衣欧美| 99re这里都是精品| 99国产欧美久久久精品| 91在线视频在线| 91在线视频网址| 色综合中文字幕国产| 国产精品一区二区在线观看不卡 | 成人看片黄a免费看在线| 国产成人在线电影| 91首页免费视频| 欧美视频第二页| 欧美二区在线观看| 精品日产卡一卡二卡麻豆| 久久久精品欧美丰满| 精品国产1区二区| 国产日韩欧美电影| 亚洲日穴在线视频| 亚洲成人www| 国产综合色在线视频区| 国产91精品精华液一区二区三区| av电影在线观看不卡| 欧美日韩一区二区不卡| 欧美tickling网站挠脚心| 欧美国产一区在线| 亚洲影视资源网| 久久精品国产一区二区三区免费看| 国内精品写真在线观看| 成人免费观看av| 欧美日韩在线播放一区| 精品久久国产字幕高潮| 国产精品二区一区二区aⅴ污介绍| 亚洲综合自拍偷拍| 国产精品911| 欧美日韩在线播放三区| 欧美变态tickle挠乳网站| 中文字幕成人网| 日本欧美大码aⅴ在线播放| 成人免费观看av| 欧美一区二区不卡视频| 亚洲日本中文字幕区| 国内精品视频一区二区三区八戒| 99久久99久久精品免费观看| 欧美一区日韩一区| 亚洲乱码日产精品bd| 经典三级视频一区| 欧美日韩二区三区| 自拍偷拍亚洲综合| 国产高清亚洲一区| 欧美日韩日日骚|