Как производительность платформы объекта 4 по сравнению с платформой объекта 3.5?

У меня есть один запрос на моей странице, которая занимает по крайней мере половину секунды для выполнения EF 3.5 использования. Когда я использовал хранимую процедуру, скорость была noticably быстрее. Это - очень сложный запрос. В предстоящем EF 4.0 будут какие-либо повышения производительности? И EF 4.0 действительно сбивает 3,5 мудрую производительности?

7
задан Chris S 17 January 2010 в 12:49
поделиться

3 ответа

Краткий ответ - это слишком рано, чтобы сказать. Парни .NET почти полностью сосредоточены на производительности, пока выпуск 12 апреля не должен быть завершен и локализован. Кроме того, что подразумевается быстрее? Быстрее можно просматривать во многих отношениях, например:

  • Framework Entity 4.0 имеет новые функции , только улучшения отслеживания объектов могут означать огромные победы, поскольку вы не делаете этого ручной работы ... в любом случае, по крайней мере, развитие быстрее.
  • Если он не работал вообще раньше, более легкие весовые объекты с POCO поддерживают могут означать, что намного меньшее количество памяти смещена при работе с большим количеством объектов. Независимо от того, насколько мало стоимость дополнительных свойств, наследуемая при выходе из БД, существует стоимость как в создании и отслеживания их (время нагрузки и потребление памяти).

В вашем конкретном случае половина секунды - это длительное время для чего-либо, кроме очень сложного или высокого объема ... Вы искали, чтобы увидеть, сколько времени проводится в базе данных и сколько Время потрачено, как только .NET имеет данные? Если вы тратите большую часть своего времени за пределами SQL, да, да, базовые улучшения в отражениях в Net 4.0 должны предоставить вам некоторое улучшение скорости ... Однако, если вы тратите все свое время в SQL, это не поможет много совсем. Большая часть вашей задачи производительности может быть индексирование сгенерированного SQL, а не на основе производительности рамок сущности.

Я бы следил за комментарием Kane, посмотрите на SQL, который он генерирует для вашего запроса, возможно ли вам опубликовать это и сохраненную процедуру, которую - это , поэтому мы можем найти, где проблема лежит?

3
ответ дан 7 December 2019 в 14:33
поделиться

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

Класс intitledviewcontroller просто содержит UISCROLL и устанавливает себя в качестве делегата. У нас есть NSARRAY с экземплярами NSString внутри в качестве модели данных (в нем может быть потенциально тысячи Nsstrings), и мы хотим показать каждому в UILabel, используя горизонтальную прокрутку. Когда пользователь прокручивает, мы смещаем UILabels, чтобы поставить один слева, другой справа, чтобы все было готово к следующему событию прокрутки.

Вот интерфейс, скорее простой:

@interface UntitledViewController : UIViewController <UIScrollViewDelegate>
{
@private
    UIScrollView *_scrollView;

    NSArray *_objects;

    UILabel *_detailLabel1;
    UILabel *_detailLabel2;
    UILabel *_detailLabel3;
}

@end

и вот реализация для этого класса:

@interface UntitledViewController ()
- (void)replaceHiddenLabels;
- (void)displayLabelsAroundIndex:(NSInteger)index;
@end

@implementation UntitledViewController

- (void)dealloc 
{
    [_objects release];
    [_scrollView release];
    [_detailLabel1 release];
    [_detailLabel2 release];
    [_detailLabel3 release];
    [super dealloc];
}

- (void)viewDidLoad 
{
    [super viewDidLoad];

    _objects = [[NSArray alloc] initWithObjects:@"first", @"second", @"third", 
                @"fourth", @"fifth", @"sixth", @"seventh", @"eight", @"ninth", @"tenth", nil];

    _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 460.0)];
    _scrollView.contentSize = CGSizeMake(320.0 * [_objects count], 460.0);
    _scrollView.showsVerticalScrollIndicator = NO;
    _scrollView.showsHorizontalScrollIndicator = YES;
    _scrollView.alwaysBounceHorizontal = YES;
    _scrollView.alwaysBounceVertical = NO;
    _scrollView.pagingEnabled = YES;
    _scrollView.delegate = self;

    _detailLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 460.0)];
    _detailLabel1.textAlignment = UITextAlignmentCenter;
    _detailLabel1.font = [UIFont boldSystemFontOfSize:30.0];
    _detailLabel2 = [[UILabel alloc] initWithFrame:CGRectMake(320.0, 0.0, 320.0, 460.0)];
    _detailLabel2.textAlignment = UITextAlignmentCenter;
    _detailLabel2.font = [UIFont boldSystemFontOfSize:30.0];
    _detailLabel3 = [[UILabel alloc] initWithFrame:CGRectMake(640.0, 0.0, 320.0, 460.0)];
    _detailLabel3.textAlignment = UITextAlignmentCenter;
    _detailLabel3.font = [UIFont boldSystemFontOfSize:30.0];

    // We are going to show all the contents of the _objects array
    // using only these three UILabel instances, making them jump 
    // right and left, replacing them as required:
    [_scrollView addSubview:_detailLabel1];
    [_scrollView addSubview:_detailLabel2];
    [_scrollView addSubview:_detailLabel3];

    [self.view addSubview:_scrollView];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [_scrollView flashScrollIndicators];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self displayLabelsAroundIndex:0];
}

- (void)didReceiveMemoryWarning 
{
    // Here you could release the data source, but make sure
    // you rebuild it in a lazy-loading way as soon as you need it again...
    [super didReceiveMemoryWarning];
}

#pragma mark -
#pragma mark UIScrollViewDelegate methods

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    // Do some initialization here, before the scroll view starts moving!
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [self replaceHiddenLabels];
}

- (void)displayLabelsAroundIndex:(NSInteger)index
{
    NSInteger count = [_objects count];
    if (index >= 0 && index < count)
    {
        NSString *text = [_objects objectAtIndex:index];
        _detailLabel1.frame = CGRectMake(320.0 * index, 0.0, 320.0, 460.0);
        _detailLabel1.text = text;
        [_scrollView scrollRectToVisible:CGRectMake(320.0 * index, 0.0, 320.0, 460.0) animated:NO];

        if (index < (count - 1))
        {
            text = [_objects objectAtIndex:(index + 1)];
            _detailLabel2.frame = CGRectMake(320.0 * (index + 1), 0.0, 320.0, 460.0);
            _detailLabel2.text = text;
        }

        if (index > 0)
        {
            text = [_objects objectAtIndex:(index - 1)];
            _detailLabel3.frame = CGRectMake(320.0 * (index - 1), 0.0, 320.0, 460.0);
            _detailLabel3.text = text;
        }
    }
}

- (void)replaceHiddenLabels
{
    static const double pageWidth = 320.0;
    NSInteger currentIndex = ((_scrollView.contentOffset.x - pageWidth) / pageWidth) + 1;

    UILabel *currentLabel = nil;
    UILabel *previousLabel = nil;
    UILabel *nextLabel = nil;

    if (CGRectContainsPoint(_detailLabel1.frame, _scrollView.contentOffset))
    {
        currentLabel = _detailLabel1;
        previousLabel = _detailLabel2;
        nextLabel = _detailLabel3;
    }
    else if (CGRectContainsPoint(_detailLabel2.frame, _scrollView.contentOffset))
    {
        currentLabel = _detailLabel2;
        previousLabel = _detailLabel1;
        nextLabel = _detailLabel3;
    }
    else
    {
        currentLabel = _detailLabel3;
        previousLabel = _detailLabel1;
        nextLabel = _detailLabel2;
    }

    currentLabel.frame = CGRectMake(320.0 * currentIndex, 0.0, 320.0, 460.0);
    currentLabel.text = [_objects objectAtIndex:currentIndex];

    // Now move the other ones around
    // and set them ready for the next scroll
    if (currentIndex < [_objects count] - 1)
    {
        nextLabel.frame = CGRectMake(320.0 * (currentIndex + 1), 0.0, 320.0, 460.0);
        nextLabel.text = [_objects objectAtIndex:(currentIndex + 1)];
    }

    if (currentIndex >= 1)
    {
        previousLabel.frame = CGRectMake(320.0 * (currentIndex - 1), 0.0, 320.0, 460.0);
        previousLabel.text = [_objects objectAtIndex:(currentIndex - 1)];
    }
}

@end

Надеюсь, это поможет!

-121--3502280-

Из блога ADO.NET :

Настройка запросов - Добавление поддержки существующих операторов LINQ, Признавая больший набор шаблонов с LINQ, написание модели определена функционирует вместе с способностью Используйте их в LINQ и ряд Другие способы создания и настройки Запросы.

Улучшения читаемости SQL генеративности - улучшение читабельность вместе с TSQL Оптимизация производительности, сгенерированные запросы, чтобы сделать это много Проще понять, что происходит

, поэтому эти два очка подразумевают, что вы могли видеть улучшения в том, как он генерирует ваш запрос от LINQ.

Однако в маловероятно, что ORM когда-либо сможет выйти за запрос, который вы написали с нуля, так как он должен уделять так много разных сценариев, и обычно наиболее распространен. EF 3.5, казалось, создал несколько очень эффективных присоединиться к SQL, когда я использовал его, наверное, лучшее, что я видел из ORM, так что есть надежда, что вы можете бросить SP в 4.0.

Если у вас есть сохраненная процедура, я предполагаю, что это большой запрос - отправка этого текста SQL каждый раз на сервер приведет к тому, что многие сетевые трафик, который является еще одним, что вы можете или не могли рассмотреть. Очевидно, на одном и том же сервере или внутри той же внутренней сети это «резка волос, чтобы похудеть» оптимизацию стиля.

1
ответ дан 7 December 2019 в 14:33
поделиться

Когда речь идет о действительно сложных запросах, я не видел никаких доказательств того, что любой из L2S, NH или EF может генерировать лучший план запроса, чем я могу в SPROC. Я люблю ORM (особенно NH), но есть еще раз, когда время исполнения ORM может быть обогащена хорошо написанным шпреком .

0
ответ дан 7 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: