Здравствуйте, Аноним, Вы писали:

А>Мучает один вопрос, насколько я понимаю при меппинге на лету для каждого класса создаётся ассембли, отражается ли ето на производительности? Сколько классов, столько ассемблей. Не тяжеловато ли ето. Или я не правильно понимаю принцип работы.


Для веб-проектов это вообще не проблема, т.к. временем инициализации в данном случае можно пренебречь. Время генерации сборок важно для старта десктоп-приложений, но на сегодняшний момент все (пока одна ) обнаруженные проблемы решены. Проблема была не в генерации как таковой, а в построении описателя класса. Но проблема очень специфическая и непонятно то ли это происходило по вине RFD, то ли по вине другой части системы, в которой использовалась библиотека.

А>Использовал ли кто-то библиотеку в реальных, больших веб проектах.


Я вам не скажу за всю Одессу, вся Одесса, понятное дело, очень велика. RSDN.ru само собой. Но также я наследил везде где появлялся

Первое комерческое крещение RFD было здесь — http://www.supratelecom.com. Флоридская телекоммуникационная компания, где я проработал два года архитектором и мог проталкивать любые, даже не очень проверенные решения В частности здесь вскрылись первые проблемы с производительностью. Reflection показал себя крайне тормозной штукой и пришлось заняться генерацией сборок. В этой конторе RFD используется как для веб-сайта, так и для внутренней биллинговой системы, для десктоп приложений, роботов и прочей ерунды.

Второй проект — http://www.amicore.com. Совместный проект Pfizer, IBM и Microsoft. Софтинка для автоматизации работы офисов докторов. Десктоп, сервера приложений, ремоутинг, BizTalk. Насчёт веба не уверен, когда я работал на проекте об этом речи не было. Здесь были сделаны основные доработки RFD в плане генерации абстрактных классов.

Мой текущей проект — http://www.tiffany.com. Проект делается опять сладкой парочкой — консалтингами IBM и Microsoft. Чистый веб. Мы делаем версию для Канады и Японии. RFD используется нашей командой для веба и другой командой, которая занимается написанием софтинки для подготовки контента (распределение бриликов и золотишка по категориям и группам).

Что касается производительности RFD вообще, то её можно потестировать с помощью следуюшего теста:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Text;

using Rsdn.Framework.Data;

namespace TestRFD
{
    public class Program
    {
        const string ConnectionString = "Server=.;Database=Northwind;Integrated Security=SSPI";
        const int    TestCount = 1000;

        static string Query;

        static Program()
        {
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < 1000; i++)
            {
                if (i != 0)
                    sb.Append(" UNION ");

                sb.Append("SELECT ");
                sb.Append(i + 1);
                sb.Append(" as Field1, 'test string' as Field2");
            }

            Query = sb.ToString();
        }

        public class TestItem
        {
            public int    Field1;
            public string Field2;
        }

        static void AdoTest()
        {
            List<TestItem> list = new List<TestItem>(1000);

            using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                con.Open();

                using (SqlCommand cmd = new SqlCommand(Query, con))
                using (SqlDataReader rd = cmd.ExecuteReader())
                {
                    while (rd.Read())
                    {
                        TestItem item = new TestItem();

                        item.Field1 = Convert.ToInt32 (rd["Field1"]);
                        item.Field2 = Convert.ToString(rd["Field2"]);

                        list.Add(item);
                    }
                }
            }
        }

        static void TestAdo()
        {
            AdoTest();

            DateTime start = DateTime.Now;

            for (int i = 0; i < TestCount; i++)
                AdoTest();

            DateTime end = DateTime.Now;

            Console.WriteLine("DataReader: {0}", end - start);
        }

        static void DataSetTest()
        {
            using (SqlConnection con = new SqlConnection(ConnectionString))
            {
                con.Open();

                using (SqlDataAdapter da  = new SqlDataAdapter(Query, con))
                {
                    DataSet ds = new DataSet();

                    da.Fill(ds);
                }
            }
        }

        static void TestDataSet()
        {
            DataSetTest();

            DateTime start = DateTime.Now;

            for (int i = 0; i < TestCount; i++)
                DataSetTest();

            DateTime end = DateTime.Now;

            Console.WriteLine("DataSet   : {0}", end - start);
        }

        static void RfdTest()
        {
            List<TestItem> list = new List<TestItem>(1000);

            using (DbManager db = new DbManager())
            {
                db
                    .SetCommand(Query)
                    .ExecuteList(list);
            }
        }

        static void TestRfd()
        {
            DbManager.AddConnectionString(ConnectionString);

            RfdTest();

            DateTime start = DateTime.Now;

            for (int i = 0; i < TestCount; i++)
                RfdTest();

            DateTime end = DateTime.Now;

            Console.WriteLine("RFD       : {0}", end - start);
        }

        static void Main(string[] args)
        {
            TestAdo();
            TestDataSet();
            TestRfd();
        }
    }
}

Для миллиона записей получаются вот такие результаты.

DataReader: 00:00:10.0937500
DataSet   : 00:00:12.1718750
RFD       : 00:00:11.3593750

Вполне возможно, что в других условиях результаты будут несколько другими.
Автор: IT    Оценить