SORU
21 NİSAN 2009, Salı


Ne kadar yavaş Yansımasıdır

Geçenlerde bir arabirim katmanı İş mantığı katmanının gelen DataAccessProvider ayırt etmek için yarattı. Bu yaklaşım ile Web/App değerleri değiştirerek istediğimiz zaman DataAccessProvider bizim seçim değiştirebiliriz.Config. (daha fazla ayrıntı gerekirse verilebilir).

Her neyse, bunu yapmak için üzerinde çalışabiliriz DataProvider bizim sınıf başarmak için yansıma kullanır.

/// <summary>
/// The constructor will create a new provider with the use of reflection.
/// If the assembly could not be loaded an AssemblyNotFoundException will be thrown.
/// </summary>
public DataAccessProviderFactory()
{
    string providerName = ConfigurationManager.AppSettings["DataProvider"];
    string providerFactoryName = ConfigurationManager.AppSettings["DataProviderFactory"];
    try
    {
    	activeProvider = Assembly.Load(providerName);
    	activeDataProviderFactory = (IDataProviderFactory)activeProvider.CreateInstance(providerFactoryName);
    }
    catch
    {
    	throw new AssemblyNotFoundException();
    }
}

Ama şimdi yavaş yansıması nasıl merak ediyorum?

CEVAP
21 NİSAN 2009, Salı


Çoğu durumda yeterli. hızlı, daha Eğer bu DAL bir kapsayıcı nesnesini oluşturmak için kullanıyorsanız, örneğin, zaman yansıması ile nesne oluşturmak için alınırçok zayıf bir ihtimalbir ağa bağlanmak için gereken zaman göre. Bu optimize etmek zaman kaybı olur.

Eğer sıkı bir döngüde yansıma kullanıyorsanız, onu geliştirmek için hileler vardır:

  • jenerik (sarıcı where T : new() MakeGenericType kullanarak)
  • 6* *(yazılı bir temsilci; kurucular için çalışmıyor)
  • Reflection.Emit - hardcore
  • Expression (Delegate.CreateDelegate, ama daha esnek ve kurucular için çalışır gibi)

Fakat sizin Amacınız, CreateInstance gayet iyi. Bu sopa ile, ve şeyleri basit tutmak.


Edit: göreceli performans, ve en önemli şey ise," kalır, daha fazla açıklamak gerekir. "tedbir kalıntıları ile ilgili en önemli nokta ise Bazen...yokönemli değil. İlk önlem. Eğer onu bulursanız, ancak,çok yavaş, Reflection.Emit kod arka planda sessizce yapar FastMember gibi bir şey sana güzel ve kolay bir API vermek; örneğin bakmak isteyebilirsiniz:

var accessor = TypeAccessor.Create(type);
List<object> results = new List<object>();
foreach(var row in rows) {
    object obj = accessor.CreateNew();
    foreach(var col in cols) {
        accessor[obj, col.Name] = col.Value;
    }
    results.Add(obj);
}

basit, ama çok hızlı olacak. Bu spesifik bir örnek bahsettiğim hakkında bir DAL sarıcı—eğer yaptıysan, bu çok göz önünde bir şey gibi dapper, yine bütün Reflection.Emit kod arka plan vermek için mümkün olan en hızlı ama kullanımı kolay API:

int id = 12345;
var orders = connection.Query<Order>(
    "select top 10 * from Orders where CustomerId = @id order by Id desc",
    new { id }).ToList();

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Le Cargo !

    Le Cargo !

    24 HAZİRAN 2007
  • Matthew Smith

    Matthew Smit

    24 Mayıs 2010
  • Sam Kear

    Sam Kear

    14 Temmuz 2007