C# 检查是否已经存在重复的标题。。它在对象的每个“保存”上执行。。。当你有2000件物品时,这不是问题。。好。。。350ms对于100000个项目来说也不是什么大问题,我猜:)(如果你能达到这个容量的话)一个拥有100k个活动项目的CMS正在进入“大型”领域。

C# 检查是否已经存在重复的标题。。它在对象的每个“保存”上执行。。。当你有2000件物品时,这不是问题。。好。。。350ms对于100000个项目来说也不是什么大问题,我猜:)(如果你能达到这个容量的话)一个拥有100k个活动项目的CMS正在进入“大型”领域。,c#,performance,linq,properties,C#,Performance,Linq,Properties,检查是否已经存在重复的标题。。它在对象的每个“保存”上执行。。。当你有2000件物品时,这不是问题。。好。。。350ms对于100000个项目来说也不是什么大问题,我猜:)(如果你能达到这个容量的话)一个拥有100k个活动项目的CMS正在进入“大型”领域。我怀疑其他地方会在这之前开始吱吱作响并显示出缩放问题的迹象。是的,好吧,我想我是个怪胎,但我必须接受这个“呼叫”与“呼叫维特”,就是这样(没什么大不了的):)请问你说的“过早”是什么意思?你是说我在这个阶段不必担心?但我正在准备一个类库(cms


检查是否已经存在重复的标题。。它在对象的每个“保存”上执行。。。当你有2000件物品时,这不是问题。。好。。。350ms对于100000个项目来说也不是什么大问题,我猜:)(如果你能达到这个容量的话)一个拥有100k个活动项目的CMS正在进入“大型”领域。我怀疑其他地方会在这之前开始吱吱作响并显示出缩放问题的迹象。是的,好吧,我想我是个怪胎,但我必须接受这个“呼叫”与“呼叫维特”,就是这样(没什么大不了的):)请问你说的“过早”是什么意思?你是说我在这个阶段不必担心?但我正在准备一个类库(cms的“引擎”,为什么不让它变得完美呢?)以一种技术上有意义的方式定义“完美”。使用
callvirt
,您的系统在您希望它处理的负载下的性能是否足够?与代码库的质量成本相比,更改对象模型以便必须有本地成员才能调用LINQ查询是否足以提高性能?如果你不能指出一个说明速度不够快的规范或缺陷。。。在这一阶段,担心
callvirt
call
之间的关系可能只不过是一种好奇。是的,我想在这种特殊情况下,这是性能与代码质量之间的关系。CMS不打算处理超过50000个甚至接近100000个对象的工作。(可以是“文章”或“产品”等),但有代码,例如检查重复标题是否已经存在。。它在对象的每个“保存”上执行。。。当你有2000件物品时,这不是问题。。好。。。350ms对于100000个项目来说也不是什么大问题,我猜:)(如果你能达到这个容量的话)一个拥有100k个活动项目的CMS正在进入“大型”领域。我怀疑其他地方会在这之前开始吱吱作响并显示出缩放问题的迹象。是的,好吧,我想我是个怪胎,但必须接受这个“呼叫”与“呼叫维特”,就是这样(没什么大不了的):)嗯,很有趣。我很惊讶get_AnotherTitle编译为callvirt而不是call。(我已经有一段时间没有在构造函数建议中考虑是否需要从不放置虚拟调用了)结果:original code=“middle dif 5”。。然后我将“AnotherTitle”从类“Channel”(现在它只位于基类中)中删除,结果是dif-61…嗯,很有趣。我很惊讶get_AnotherTitle编译为callvirt而不是call。(我已经有一段时间没有在构造函数建议中考虑是否需要从不放置虚拟调用了)结果:original code=“middle dif 5”。。然后我将“AnotherTitle”从类“Channel”(现在它只位于基类中)中删除,结果是dif-61。。。
public abstract class ContentItem: IContent
{
    internal ContentItem() { }

    [DataMember]
    [IndexedField(true, false)]
    public string Guid { get; set; }

    [DataMember]
    [IndexedField(false, true)]
    public string Title { get; set; }
}
[IndexedClass]
public class Channel : ContentItem, IContent
{
    [DataMember(IsRequired = false, EmitDefaultValue = false)]
    [ContentField]
    public string TitleShort { get; set; }
}
public virtual T ByTitle(string title)
{
    return All.Find(item => item.Title == title);
}
private static void test(Content.Repository<Content.Channel> channels)
        {
            int iterations = 100000;

            var watch = System.Diagnostics.Stopwatch.StartNew();

            for (int i = 0; i < iterations; i++)
            {
                var channel = channels.ByTitle("Unique-Title");
            }

            watch.Stop();

            Console.WriteLine("Done in {0} ms.", watch.ElapsedMilliseconds);
        }
public abstract class ContentItem 
{
    public string Title { get; set; }
    public string AnotherTitle { get; set; }
}

public class Channel : ContentItem
{
    public string AnotherTitle { get; set; }
}

private static void Main(string[] args)
{
    var channels = new List<Channel>();
    for (int i = 0; i < 3000; i++)
    {
        channels.Add(new Channel(){Title = i.ToString(), AnotherTitle = i.ToString()});
    }
    int iterations = 100000;
    System.Diagnostics.Stopwatch watch;
    var difs = new List<int>();
    int rounds = 10;
    for (int k = 0; k < rounds ; k++)
    {
        watch = System.Diagnostics.Stopwatch.StartNew();
        for (int i = 0; i < iterations; i++)
        {
            var channel = channels.Find(item => item.Title == "2345");
        }
        watch.Stop();
        long timerValue = watch.ElapsedMilliseconds;
        watch = System.Diagnostics.Stopwatch.StartNew();
        for (int i = 0; i < iterations; i++)
        {
            var channel = channels.Find(item => item.AnotherTitle == "2345");
        }
        watch.Stop();
        difs.Add((int)(timerValue - watch.ElapsedMilliseconds));
    }

    Console.WriteLine("result middle dif " + difs.Sum()/rounds);
}
IL_0008:  callvirt   instance string ConsoleApplication4.Program/ContentItem::get_Title()
IL_0016:  callvirt   instance string ConsoleApplication4.Program/Channel::get_AnotherTitle()