Здравствуйте, Аноним, Вы писали:
А>Мучает один вопрос, насколько я понимаю при меппинге на лету для каждого класса создаётся ассембли, отражается ли ето на производительности? Сколько классов, столько ассемблей. Не тяжеловато ли ето. Или я не правильно понимаю принцип работы.
Для веб-проектов это вообще не проблема, т.к. временем инициализации в данном случае можно пренебречь. Время генерации сборок важно для старта десктоп-приложений, но на сегодняшний момент все (пока одна
) обнаруженные проблемы решены. Проблема была не в генерации как таковой, а в построении описателя класса. Но проблема очень специфическая и непонятно то ли это происходило по вине 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
Вполне возможно, что в других условиях результаты будут несколько другими.