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

完善主體資料,免費(fèi)贈(zèng)送VIP會(huì)員!
* 主體類型
* 企業(yè)名稱
* 信用代碼
* 所在行業(yè)
* 企業(yè)規(guī)模
* 所在職位
* 姓名
* 所在行業(yè)
* 學(xué)歷
* 工作性質(zhì)
請(qǐng)先選擇行業(yè)
您還可以選擇以下福利:
行業(yè)福利,領(lǐng)完即止!

下載app免費(fèi)領(lǐng)取會(huì)員

NULL

ad.jpg

二次開發(fā)教程:orm 里使用Emit

發(fā)布于:2019-07-24 16:33:26

網(wǎng)友投稿

更多

比較一下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++)

            {

                ///讀數(shù)據(jù)

                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}";

        }

    }

}

輸出結(jié)果為


反射時(shí)間2725


Emit 時(shí)間1745


直接賦值1604

本文版權(quán)歸腿腿教學(xué)網(wǎng)及原創(chuàng)作者所有,未經(jīng)授權(quán),謝絕轉(zhuǎn)載。

未標(biāo)題-1.jpg

上一篇:二次開發(fā)教程:Dapper里使用Attribute自定義映射關(guān)系

下一篇:二次開發(fā)教程:Emit 循環(huán)

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

      9000px;">

          午夜视频一区二区| 精品亚洲成a人| ww亚洲ww在线观看国产| 国产亚洲欧美日韩在线一区| 国产精品不卡在线观看| 亚洲一区二区三区四区在线观看| 日韩精品欧美成人高清一区二区| 国产精品一区二区果冻传媒| 色婷婷av一区二区| 精品国产免费人成电影在线观看四季| **网站欧美大片在线观看| 亚洲观看高清完整版在线观看| 精品一区二区三区在线视频| 91网站最新网址| 日韩午夜精品视频| 最新久久zyz资源站| 久久aⅴ国产欧美74aaa| 99久久er热在这里只有精品15 | 亚洲国产精品天堂| 成人精品小蝌蚪| 日韩午夜在线影院| 水野朝阳av一区二区三区| av不卡在线播放| 久久精品欧美一区二区三区麻豆| 婷婷久久综合九色综合绿巨人 | 欧美少妇一区二区| 中文字幕不卡在线| 国产精品自拍三区| 26uuu另类欧美| 日本成人在线不卡视频| 欧美三级视频在线| 亚洲一区二区三区不卡国产欧美| 成人免费视频网站在线观看| 久久毛片高清国产| 九九久久精品视频| 欧美电视剧在线观看完整版| 日本伊人色综合网| 欧美日韩精品欧美日韩精品| 亚洲一区二区视频在线观看| 色欧美88888久久久久久影院| 国产精品久久久久久一区二区三区| 国内成人自拍视频| 久久久777精品电影网影网| 狠狠色丁香婷婷综合| 久久亚洲捆绑美女| 国产盗摄视频一区二区三区| 久久精品人人做人人综合| 国产美女主播视频一区| 久久九九国产精品| 丁香婷婷综合网| 欧美国产1区2区| 不卡视频在线看| 亚洲人被黑人高潮完整版| 成人一区在线观看| 自拍偷拍欧美激情| 色94色欧美sute亚洲线路一ni| 亚洲三级在线播放| 色综合天天综合网国产成人综合天| 亚洲欧洲www| 欧美视频精品在线观看| 蜜臀a∨国产成人精品| 欧美网站一区二区| 玉足女爽爽91| 欧美一区二区三区日韩| 日本在线不卡一区| 日韩久久精品一区| 国产成人精品亚洲777人妖| 亚洲三级电影网站| 日韩久久精品一区| 97久久精品人人做人人爽| 亚洲中国最大av网站| 一本一道久久a久久精品综合蜜臀| 国产精品久久福利| 欧美日韩在线综合| 精品一区二区精品| 亚洲免费观看高清完整版在线 | 亚洲成人资源在线| 欧美一区二区久久久| 国内久久精品视频| 国产精品九色蝌蚪自拍| 欧美在线一区二区三区| 久久精品国产999大香线蕉| 国产精品伦理一区二区| 777色狠狠一区二区三区| 美女脱光内衣内裤视频久久影院| 国产亚洲欧洲997久久综合| 91原创在线视频| 秋霞影院一区二区| 久久久久亚洲综合| 欧美视频第二页| 成人黄动漫网站免费app| 午夜一区二区三区在线观看| 久久精品视频一区二区| 91精品免费在线| 日韩在线一区二区三区| 欧美激情艳妇裸体舞| 欧美一区在线视频| 色8久久人人97超碰香蕉987| 国产福利精品一区二区| 亚洲成人7777| 亚洲欧美另类小说| 欧美国产在线观看| 91精品国产色综合久久不卡蜜臀| 色综合久久99| gogo大胆日本视频一区| 国产最新精品免费| 美女网站在线免费欧美精品| 亚洲第一综合色| 亚洲精品视频免费看| 国产无遮挡一区二区三区毛片日本 | 日韩一级二级三级| 色av成人天堂桃色av| 不卡大黄网站免费看| 国产精品18久久久久久久久 | 欧美成人免费网站| 欧美麻豆精品久久久久久| 972aa.com艺术欧美| 国产精品18久久久久| 日本中文字幕一区二区视频| 亚洲第一狼人社区| 亚洲小少妇裸体bbw| 18成人在线视频| 亚洲精品一卡二卡| 亚洲欧美日韩人成在线播放| 久久色中文字幕| 久久婷婷一区二区三区| 精品国产乱码久久久久久闺蜜| 日韩午夜中文字幕| 精品日韩在线观看| 久久久国产一区二区三区四区小说 | 国产精品久99| 亚洲欧美一区二区三区极速播放| 国产精品麻豆99久久久久久| 国产视频亚洲色图| 国产精品色眯眯| 亚洲图片你懂的| 亚洲午夜视频在线观看| 无码av免费一区二区三区试看| 亚瑟在线精品视频| 日本亚洲免费观看| 久久精品国产精品亚洲精品| 久久99精品国产麻豆婷婷洗澡| 久久激情综合网| 美女视频免费一区| 国模娜娜一区二区三区| 不卡的电影网站| 欧美日韩视频一区二区| 欧美r级电影在线观看| 欧美激情一区二区三区| 亚洲二区在线观看| 久久国产日韩欧美精品| 国产宾馆实践打屁股91| 欧美自拍丝袜亚洲| 精品三级在线看| 一区二区三区中文在线观看| 日本在线不卡一区| 国产成+人+日韩+欧美+亚洲| 色噜噜狠狠色综合中国| 91麻豆精品国产91久久久久久| 欧美精品一区二| 亚洲欧美另类图片小说| 久久成人精品无人区| 99re这里只有精品视频首页| 欧美精选一区二区| 国产欧美一区二区三区沐欲| 亚洲在线一区二区三区| 韩国av一区二区三区| 91久久久免费一区二区| 91精品国产欧美日韩| 国产欧美一区二区三区沐欲| 日韩激情视频网站| 99久久综合精品| 日韩精品在线看片z| 亚洲少妇屁股交4| 久久精品国产亚洲高清剧情介绍 | 91老师国产黑色丝袜在线| 日韩欧美亚洲一区二区| 亚洲色图.com| 国产很黄免费观看久久| 91精选在线观看| 中文字幕欧美三区| 久久国产精品第一页| 欧美性色综合网| 国产精品久久综合| 韩国在线一区二区| 欧美肥大bbwbbw高潮| 一区二区三区日韩欧美| 成人永久免费视频| 欧美大片国产精品| 亚洲大片在线观看| 一本到不卡精品视频在线观看 | 2020国产成人综合网| 亚洲免费观看高清| 国产成人综合网站| 久久在线观看免费| 青青草一区二区三区| 欧美日韩激情在线| 一区二区三区在线免费播放| 成人一道本在线| 国产女人aaa级久久久级|