Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не ресурсоемкая таблица, Большое использование опер. памяти 
V
    Опции темы
CYBERDREAM
Дата 22.11.2010, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 3
Всего: 28



Приветствую всех.
Есть таблица с данными(100 строк, 50 столбцов).
Дали задание ускорить и оптимизировать. 

Сейчас реализована следующая: Grid (100 строк/50 колонок) и напиханы текстбоксы (создается все динамически). (отжирает порядка 100 метров) - что не удивительно в принципе.
Попробовал через DataGrid (WPF Toolkit) - уменьшилось до 55-60 мб (все равно жирно как то)
Попробовал через ListView - ~36мб, уже лучше (правда чтобы уметь редактировать ячейки - надо по извращаться).

Какие еще есть способы? 
В винформс, DataGridView съедает порядка 2.5 метров. А wpf обжирается во всю на этих данных.

P.S.: DataGrid/ListView/... мне нужно запихнуть в другой грид (так уж написана история) поэтому не особо кошерно использовать WinFormHost


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
CYBERDREAM
Дата 22.11.2010, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 3
Всего: 28



И хотелось бы в частности узнать, чем именно вызваны эти тормоза в WPF


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
CYBERDREAM
Дата 23.11.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 3
Всего: 28



Попробовал канвой нарисовать, ускорение есть конечно, но все равно жирновато. К тому же при второй отрисовке память подскакивает до 54 примерно
Код

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;

namespace BigGridTest
{
    public class InputGrid : Canvas
    {
        private const String ArgumentOutIndex = @"Не правильно заданы индексы массива";
        private readonly TextBox _tb = new TextBox();
        private Boolean _content;
        private string[,] _data;
        private FormattedText[,] _formatted;

        static InputGrid()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(InputGrid),
                                                     new FrameworkPropertyMetadata(typeof(InputGrid)));
        }

        public InputGrid()
        {
            MouseUp += InputForrmDataGridMouseUp;
            _tb.GotFocus += TbGotFocus;
            _tb.GotKeyboardFocus += TbGotFocus;

            ColumnWidth = 100;
            RowHeight = 24;
            GridPen = new Pen(Brushes.Silver, 1);
            _tb.KeyDown += TbKeyDown;
            _data = new string[RowsCount, ColumnsCount];
            _formatted = new FormattedText[RowsCount, ColumnsCount];
        }

        public Pen GridPen { get; private set; }

        private double ColumnWidth { get; set; }
        private double RowHeight { get; set; }

        public int RowsCount { get; private set; }
        public int ColumnsCount { get; private set; }
        public IndexIJ CurrentIndex { get; private set; }

        public String this[int row, int column]
        {
            get
            {
                if (row >= RowsCount || column >= ColumnsCount)
                    throw new ArgumentOutOfRangeException(ArgumentOutIndex);
                return _data[row, column];
            }
            set
            {
                if (row >= RowsCount || column >= ColumnsCount)
                    throw new ArgumentOutOfRangeException(ArgumentOutIndex);
                _data[row, column] = value;
            }
        }

        protected override int VisualChildrenCount
        {
            get
            {

                return Children.Count;
            }
        }

        protected override Visual GetVisualChild(int index)
        {
            return _tb;
        }

        private void TbKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Escape)
            {
                _tb.Text = _data[CurrentIndex.I, CurrentIndex.J];
                HideContent();
                return;
            }
            if (e.Key == Key.Enter)
            {
                AcceptText(true);

                InvalidateVisual();

                return;
            }
            if (e.Key == Key.Tab)
            {
                AcceptText(false);
                NextItem();
                UpdateEditPosition();
                //InvalidateVisual();
                Focus();
                _tb.Focus();
                return;
            }
        }

        private void NextItem()
        {
            if (CurrentIndex.I < RowsCount || CurrentIndex.J < ColumnsCount)
            {
                if (CurrentIndex.J == ColumnsCount - 1)
                    CurrentIndex = new IndexIJ(CurrentIndex.I + 1, 0);
                else
                    CurrentIndex = new IndexIJ(CurrentIndex.I, CurrentIndex.J + 1);
            }
        }

        private void HideContent()
        {
            Children.Remove(_tb);
            //InvalidateVisual();
            _content = false;
        }

        private void ShowContent()
        {
            if (!_content)
            {
                _content = true;
                Children.Add(_tb);
            }

            //InvalidateVisual();
        }

        private void AcceptText(Boolean hide)
        {
            _data[CurrentIndex.I, CurrentIndex.J] = _tb.Text;
            _formatted[CurrentIndex.I, CurrentIndex.J] = new FormattedText(
                        _data[CurrentIndex.I, CurrentIndex.J],
                        CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
                        new Typeface("Calibri"),
                        14,
                        Brushes.Black);
            if (hide)
                HideContent();
        }

        /// <summary>
        ///   Обновить количство строк и столбцов в таблице
        /// </summary>
        /// <param name = "row">Количество строк</param>
        /// <param name = "column">Количество столбцов</param>
        /// <returns>Возвращает true, если размер был изменен</returns>
        public Boolean SetSize(int row, int column)
        {
            if (row == RowsCount && column == ColumnsCount)
                return false;

            var mass = new string[row, column];
            for (int i = 0; i < row && i < RowsCount; i++)
                for (int j = 0; j < column && j < RowsCount; j++)
                {
                    mass[i, j] = _data[i, j];

                    //tbs[i, j] = _textBlock[i, j];
                }

            ColumnsCount = column;
            RowsCount = row;
            //_textBlock = tbs;
            _data = mass;
            _formatted = new FormattedText[row, column];
            Children.Capacity = RowsCount * ColumnsCount;
            Children.RemoveRange(0, Children.Count);
            for (int i = 0; i < RowsCount; i++)
                for (int j = 0; j < ColumnsCount; j++)
                {
                    _data[i, j] = String.Format("{0}-{1}", i, j);
                    _formatted[i, j] = new FormattedText(
                        _data[i, j],
                        CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
                        new Typeface("Calibri"),
                        14,
                        Brushes.Black);
                }
            return true;
        }

        private void InputForrmDataGridMouseUp(object sender, MouseButtonEventArgs e)
        {
            Boolean draw = _content && _data[CurrentIndex.I, CurrentIndex.J] != _tb.Text;
            AcceptText(false);
            Point p = e.GetPosition(this);
            var column = (int)Math.Floor(p.X / (ColumnWidth));
            var row = (int)Math.Floor((p.Y / (RowHeight)));
            CurrentIndex = new IndexIJ(row, column);
            if (CurrentIndex.I >= RowsCount || CurrentIndex.J >= ColumnsCount)
            {
                HideContent();
                InvalidateVisual();
                return;
            }
            UpdateEditPosition();
            ShowContent();
            if (draw)
                InvalidateVisual();
            _tb.Focus();
            _tb.SelectAll();
        }

        private void UpdateEditPosition()
        {
            _tb.Text = _data[CurrentIndex.I, CurrentIndex.J];

            //_tb.Margin = new Thickness(ColumnWidth * CurrentIndex.J, RowHeight * CurrentIndex.I, 0, 0);
            SetLeft(_tb, ColumnWidth * CurrentIndex.J);
            SetTop(_tb, RowHeight * CurrentIndex.I);
            _tb.Width = ColumnWidth;
            _tb.Height = RowHeight;
            _tb.Measure(new Size(100, 24));
        }

        private void TbGotFocus(object sender, RoutedEventArgs e)
        {
            _tb.SelectAll();
        }



        protected override Size MeasureOverride(Size constraint)
        {
            return new Size(ColumnsCount * ColumnWidth, RowsCount * RowHeight);
        }


        protected override void OnRender(DrawingContext drawingContext)
        {
            drawingContext.DrawRectangle(new SolidColorBrush(Colors.White), new Pen(Background, 0),
                                         new Rect(0, 0, ActualWidth, ActualHeight));
            for (int r = 0; r <= RowsCount; ++r)
            {
                double y = r * RowHeight;
                drawingContext.DrawLine(GridPen, new Point(0, y), new Point(ActualWidth, y));
            }

            for (int c = 0; c < ColumnsCount; ++c)
            {
                double x = c * ColumnWidth;
                drawingContext.DrawLine(GridPen, new Point(x, 0), new Point(x, ActualHeight));
            }

            for (int r = 0; r < RowsCount; ++r)
                for (int c = 0; c < ColumnsCount; ++c)
                    drawingContext.DrawText(_formatted[r, c], new Point(c * ColumnWidth + 7, r * RowHeight + 3));

        }
    }
}



--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
gambit
Дата 23.11.2010, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: нет
Всего: 40



Цитата(CYBERDREAM @  22.11.2010,  08:25 Найти цитируемый пост)
Попробовал через ListView - ~36мб, уже лучше (правда чтобы уметь редактировать ячейки - надо по извращаться).

вы через диспедчер задач смотрите??? не смотрите. wpf подгружает directx Библиотеки, по этому, тупо форма с одним текст боксом и кнопкой, спокойно может отжирать до 50 метров.
PM MAIL ICQ Skype   Вверх
CYBERDREAM
Дата 23.11.2010, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 3
Всего: 28



И через так, и через....
Код

long Process_MemoryStart = 0;
Process MyProcess = System.Diagnostics.Process.GetCurrentProcess();
Process_MemoryStart = MyProcess.PrivateMemorySize64;

Ну это по сути одно и тоже - показывает все загружаемые библиотечки и т.д.

Датагрид добавляется на форму динамически (ну или листвью или др. компонент).
То бишь сначала форма с кнопкой открывается. памяти съедается ~14mb, добавляю датагрид/Listview  прирост памяти существенный выходит.
Так что я сужу по разнице  именно



--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
CYBERDREAM
Дата 23.11.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 3
Всего: 28



В общем оказалось что на такой контрол (размер 5000пикс на 2400 пикс) отъедается 16-17мб, 
После прорисовок потребление памяти подскакивает на 15-20, но потом обратно до своих 16-17 опускается.
Как говорится контрол унаследовал универсальный интерфейс. Надеюсь кто то все таки подкинет опытные материалы, буду благодарен

Это сообщение отредактировал(а) CYBERDREAM - 23.11.2010, 15:47


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
CYBERDREAM
Дата 25.11.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

Репутация: 3
Всего: 28



Сделал рисование только видимой области, плюс Scrollviewer с отложенной прокруткой - занимает порядка 2.5мб


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.