色女孩综合网_天天做天天添婷婷我也去 _日韩视频高清_草草影院免费

完善主體資料,免費贈送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
色女孩综合网_天天做天天添婷婷我也去 _日韩视频高清_草草影院免费

    9000px;">

      91美女视频网站| 99久久免费视频.com| 成人欧美一区二区三区白人| 91精品国产美女浴室洗澡无遮挡| 色综合婷婷久久| 99久久综合99久久综合网站| 成人中文字幕在线| 风间由美中文字幕在线看视频国产欧美| 久久99久久久欧美国产| 久久精品久久精品| 精品亚洲免费视频| 激情亚洲综合在线| 国产久卡久卡久卡久卡视频精品| 美美哒免费高清在线观看视频一区二区| 亚洲国产日韩av| 午夜精品久久久久久不卡8050| 亚洲福利电影网| 日韩精品欧美精品| 美国十次综合导航| 国产一区在线看| 国产ts人妖一区二区| 成人激情校园春色| 91国偷自产一区二区使用方法| 在线欧美日韩国产| 日韩免费视频线观看| 久久久五月婷婷| 中文字幕在线不卡一区二区三区| 中文字幕一区二区三区四区不卡| 亚洲精品视频自拍| 理论片日本一区| 国产一区二区三区久久久| 国产精品69毛片高清亚洲| 99精品在线免费| 欧美三区免费完整视频在线观看| 日韩欧美国产1| 亚洲图片激情小说| 男人的天堂久久精品| 国产一区二区精品久久91| 成人av影院在线| 欧美日本免费一区二区三区| 日韩一区二区三区在线观看| 国产亚洲午夜高清国产拍精品| 国产精品电影院| 日韩国产在线观看| a级高清视频欧美日韩| 欧美一区二区久久| 综合av第一页| 国内精品久久久久影院色| 色哟哟国产精品| 久久网站热最新地址| 亚洲成a人片在线观看中文| 国产成人免费视频网站| 欧美影视一区二区三区| 久久一留热品黄| 亚洲不卡av一区二区三区| 成人精品鲁一区一区二区| 日韩一二三区不卡| 亚洲电影一区二区| 99麻豆久久久国产精品免费| 欧美成人一区二区三区在线观看 | 欧美这里有精品| 精品国产自在久精品国产| 亚洲韩国精品一区| 丁香网亚洲国际| 欧美精品粉嫩高潮一区二区| 国产精品剧情在线亚洲| 国产精品一二二区| 欧美变态口味重另类| 美腿丝袜亚洲三区| 欧美一区二区视频观看视频| 日韩一区欧美小说| av福利精品导航| 国产精品久久久久永久免费观看 | 久久草av在线| 日韩午夜中文字幕| 亚洲bt欧美bt精品777| a级精品国产片在线观看| 久久久久久久国产精品影院| 石原莉奈在线亚洲二区| 欧美人牲a欧美精品| 亚洲成a人v欧美综合天堂下载| 一本一道综合狠狠老| 国产日韩欧美综合在线| 国内成+人亚洲+欧美+综合在线| 欧美一区二区二区| 日韩av中文在线观看| 日韩一区二区三区精品视频| 七七婷婷婷婷精品国产| 日韩免费视频一区| 精品亚洲porn| 国产精品丝袜在线| 91天堂素人约啪| 亚洲国产精品久久久久秋霞影院| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 久久伊人蜜桃av一区二区| 国产真实乱偷精品视频免| 久久久久久久一区| 国产91丝袜在线观看| 国产拍揄自揄精品视频麻豆| 99热国产精品| 婷婷开心激情综合| 久久精品一级爱片| 不卡视频在线观看| 夜夜爽夜夜爽精品视频| 555www色欧美视频| 国产91丝袜在线观看| 亚洲最新视频在线播放| 日韩欧美国产精品一区| 大胆亚洲人体视频| 亚洲大片一区二区三区| 欧美变态口味重另类| 成人综合日日夜夜| 午夜欧美在线一二页| 精品国产99国产精品| www.久久久久久久久| 午夜精品在线看| 欧美精品一区二区三区一线天视频| 国产99久久精品| 亚洲一卡二卡三卡四卡| 久久一二三国产| 欧美色涩在线第一页| 国产精品主播直播| 亚洲综合在线视频| 久久综合狠狠综合| 欧美日韩中文国产| 丁香婷婷综合五月| 九九视频精品免费| 国产成人av影院| 国产精品欧美久久久久一区二区| 久久草av在线| 亚洲午夜日本在线观看| 国产农村妇女毛片精品久久麻豆| 欧美自拍偷拍一区| 成人免费的视频| 久久99精品久久久久久动态图| 亚洲乱码国产乱码精品精可以看| 精品成人免费观看| 欧美羞羞免费网站| 成人国产一区二区三区精品| 美女视频黄免费的久久| 香蕉成人啪国产精品视频综合网 | 成人成人成人在线视频| 久88久久88久久久| 日本伊人色综合网| 夜夜嗨av一区二区三区四季av| 国产精品免费视频观看| 久久蜜臀中文字幕| 日韩欧美一二三| 在线91免费看| 欧美日韩在线观看一区二区| 99久久精品免费观看| 成人黄色免费短视频| 国产成人自拍网| 国产精品白丝jk黑袜喷水| 国产在线麻豆精品观看| 狠狠色丁香久久婷婷综| 国产精品123区| 国模娜娜一区二区三区| 精品影院一区二区久久久| 久久aⅴ国产欧美74aaa| 美腿丝袜一区二区三区| 日韩精彩视频在线观看| 免费观看30秒视频久久| 美国一区二区三区在线播放| 久久国产精品第一页| 久久精品免费观看| 国产精品99久久久久| k8久久久一区二区三区| 成人av中文字幕| 91视频在线观看免费| www.日韩av| 欧洲国内综合视频| 777午夜精品视频在线播放| 欧美一区二区女人| 久久青草国产手机看片福利盒子| 亚洲精品一区二区三区99| 久久综合狠狠综合| 亚洲天天做日日做天天谢日日欢| 亚洲美女视频在线观看| 亚洲图片欧美一区| 精品伊人久久久久7777人| 不卡在线观看av| 欧美喷潮久久久xxxxx| 亚洲精品一区二区三区福利 | 欧美日韩一区成人| 久久久精品免费网站| 亚洲视频你懂的| 日本欧美一区二区三区乱码| 国产伦精品一区二区三区免费 | 亚洲丝袜制服诱惑| 日韩电影网1区2区| 粉嫩aⅴ一区二区三区四区 | 日韩欧美在线影院| 国产精品美女久久久久aⅴ | 欧美日韩一区不卡| 国产性做久久久久久| 亚洲国产成人tv| 国产a视频精品免费观看| 欧美日本免费一区二区三区| 国产三级一区二区|