如何提高非虚拟化 DataGrid 的排序性能?

     2023-02-22     158

关键词:

【中文标题】如何提高非虚拟化 DataGrid 的排序性能?【英文标题】:How to improve Sorting performance on a None-Virtualized DataGrid? 【发布时间】:2011-09-01 16:10:21 【问题描述】:

我相信你们中的大多数人现在会惊讶于为什么我们必须关闭 wpf 数据网格的虚拟化。虽然虚拟化确实有助于减少内存占用,但它会增加 CPU 开销,并且滚动体验并非完美无缺。

由于客户的要求,我们不得不禁用数据网格中的虚拟化并进一步优化它,现在它可以非常平滑地上下滚动,没有任何延迟。缺点是数据是预先加载并保存在内存中的。这是我们可以接受的解决方案。

然而,排序现在已成为一个大问题。虽然使用 CustomSorter : IComparer 确实是比通常的 SortDecriptors 更好的排序替代方案,但在我们的案例中它几乎没有任何区别,尽管整个行都被重绘了。

有什么方法可以提高非虚拟化数据网格的排序速度?

非常感谢,

更新:

我遇到了一个想法,我正在努力实施。解除绑定 Itemssource,进行排序,排序完成后,重新绑定 Itemssource。

为了实现这一点,我从 DataGrid 派生来捕获 SortHandler(即用户单击列时)

public class CustomSortDataGrid : DataGrid
    
        public CustomSortDataGrid()
        
            Sorting += SortHandler;
        

        private void SortHandler(object sender, DataGridSortingEventArgs e)
        
            DataGridColumn column = e.Column;
            IComparer comparer = null;

            // prevent the built-in sort from sorting
            e.Handled = true;

            ListSortDirection direction = (column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending;

            //set the sort order on the column
            column.SortDirection = direction;

            //use a ListCollectionView to do the sort.
            var lcv = (ListCollectionView)CollectionViewSource.GetDefaultView(ItemsSource);


            comparer = new BidYieldComparer(direction);

            //apply the sort
            lcv.CustomSort = comparer;

        
    

这将利用优于 SortDescriptors 的更快的比较器排序。 现在的问题是我在什么阶段取消绑定项目排序,应用排序,等待排序,一旦事件(哪个?)触发然后将 Itemssource 重新绑定到视图。

BindingOperations.ClearBinding(this, ItemsSourceProperty);

上面的这一行将清除绑定。

//apply the sort
            lcv.CustomSort = comparer;

理论上(不确定这是否正确)ItemsSource = lcv;会重新绑定它。但是性能还是一样的。 :(

有人知道吗?

【问题讨论】:

在您的网格中实现分页 :) 您显示了多少数据?一些第三方网格的排序速度非常快,如果预算允许,您至少应该尝试一下。 Microsoft WPF Datagrid 被广泛低估。我们已从 Xceed 切换到后者,因为您无法在 Xceed 中禁用虚拟化。我们需要 Excel 体验,而大多数第三方都不够快,无法处理这个问题。甚至没有基础设施。分页也不起作用,因为它带走了滚动功能。 【参考方案1】:

尝试先对您的集合进行排序,然后将排序后的集合绑定到您的 DataGrid。排序操作的速度取决于您将使用的排序算法。我曾经使用 插入排序算法,您可以在 http://en.wikipedia.org/wiki/Insertion_sort 中了解该算法。我很快就会给你发一个例子。

更新

你可以找到VB.Net实现here

你可以找到C#实现here

【讨论】:

你可以使用VB.Net写的代码miroprocessor.blogspot.com/2011/05/… 您好,谢谢。但是这个算法比 IComparer 快多少呢? 两年前的@Kave 我想对一个庞大且非常复杂的集合进行排序,我尝试了包括IComparer在内的许多解决方案,但最好的时间是我使用插入排序算法。 @Kave 如果有帮助,请选择它作为答案或至少投票,谢谢 @Kave 这是我的代码的 C# 版本,希望对您有所帮助。 miroprocessor.blogspot.com/2011/06/…【参考方案2】:

我猜这里的性能问题不是排序,而是绑定和重新绑定本身。

只需清除绑定并重新绑定您的网格。与排序相比,您应该不会看到太大的差异。

如果是这种情况,您可以尝试简化该网格的模板和样式(如果您正在使用)。

【讨论】:

没有虚拟化的 WPF DataGrid 性能

】没有虚拟化的WPFDataGrid性能【英文标题】:WPFDataGridPerformancewithoutvirtualization【发布时间】:2014-08-0223:36:56【问题描述】:我刚收到一个关于微软PresentationFramework的问题DataGrid:我有一个ObservableCollection<TestModel>。TestMod... 查看详情

如何优化并行排序以提高时间性能?

】如何优化并行排序以提高时间性能?【英文标题】:HowcanIoptimizeparallelsortingtoimprovetemporalperformance?【发布时间】:2019-04-2312:00:30【问题描述】:我有一个算法可以对给定长度的列表进行并行排序:importControl.Parallel(par,pseq)importDa... 查看详情

如何提高查询性能

】如何提高查询性能【英文标题】:HowcanIimprovequeryperformance【发布时间】:2016-11-1817:50:48【问题描述】:我有一个永远在旋转的查询。我是DBA方面的新手。我想知道处理此类问题的第一件事是什么?我看了执行计划该表在ClassCode... 查看详情

如何提高latex的编译速度?

一、简单粗暴的提速方案直接提速2-3倍的方法:别用Windows。工作原因非要用windows不可的话,装一台linux虚拟机里编译都比windows快。有钱的直接买mac,没钱的装Linux。线性提速的方法:用单核性能最好的CPU。有钱的直接上M1Macbook... 查看详情

ProcessPoolExecutor 以非直观的方式提高性能

】ProcessPoolExecutor以非直观的方式提高性能【英文标题】:ProcessPoolExecutorincreaseperformanceinnon-intuitiveway【发布时间】:2020-10-3021:08:14【问题描述】:我有一个基本上是多线程的应用程序:线程1是计算,线程2是GUI(Tkinter)。计算的... 查看详情

[日常工作]非windowsserver系统远程经常断以及提高性能的方法

...都有一个energystart的标识意味着机器的性能复核节能标准,如何节能的很大一方面就是使用平衡模式或者是节能模式. 2.设置的地点: 控制面板 查看详情

将行非规范化为列是不是会提高 SQL Server 中的性能?

】将行非规范化为列是不是会提高SQLServer中的性能?【英文标题】:DoesdenormalizingrowstocolumnsenhanceperformanceinSQLServer?将行非规范化为列是否会提高SQLServer中的性能?【发布时间】:2013-05-0804:47:41【问题描述】:我的数据是整数值矩... 查看详情

非规范化会提高 SQL 的性能吗? [关闭]

】非规范化会提高SQL的性能吗?[关闭]【英文标题】:WilldenormalizationimproveperformanceinSQL?[closed]【发布时间】:2014-06-0620:48:44【问题描述】:我想加快我们的SQL查询速度。我已经开始阅读一本关于数据仓库的书,其中您有一个单独... 查看详情

提高多列索引和排序的性能

】提高多列索引和排序的性能【英文标题】:Improveperformanceonmulticolumnindexandsort【发布时间】:2014-03-1719:33:22【问题描述】:SELECT*FROMtable1WHERE(col1,col2)IN(($1,$2),($3,$4))ORDERBYcol3LIMIT10;EXPLAINANALYZE的输出:Limit(cost=59174.75..59174.77rows=10 查看详情

对连接的结果进行排序时,索引是不是会提高性能

】对连接的结果进行排序时,索引是不是会提高性能【英文标题】:doesindeximproveperformancewhensortingresultsofajoin对连接的结果进行排序时,索引是否会提高性能【发布时间】:2017-02-0913:54:22【问题描述】:我想对4个表之间的连接结... 查看详情

Redshift 按字母排序会提高性能吗?

】Redshift按字母排序会提高性能吗?【英文标题】:Redshiftsortbyalphabetwouldincreaseperformance?【发布时间】:2014-09-2605:51:06【问题描述】:我想知道如果我按字母对我的Redshift数据库进行排序,它会提高使用排序列查找的性能吗?假设... 查看详情

如何在不改变db结构的情况下提高Mysql数据库性能

】如何在不改变db结构的情况下提高Mysql数据库性能【英文标题】:HowtoimproveMysqldatabaseperformancewithoutchangingthedbstructure【发布时间】:2014-12-2601:52:43【问题描述】:我有一个已经在使用的数据库,我必须提高使用该数据库的系统的... 查看详情

使用地理位置按距离排序提高性能

】使用地理位置按距离排序提高性能【英文标题】:Improveperformanceusinggeolocationtosortbydistance【发布时间】:2016-10-2120:34:54【问题描述】:我必须构建一个posts表的结构来处理大量数据(比如说,100万行),尤其是这两个字段:latit... 查看详情

是否可以提高基于 ID 的行列表的排序性能?

】是否可以提高基于ID的行列表的排序性能?【英文标题】:IsitpossibletoimprovesortperfomanceofID-basedlistofrows?【发布时间】:2015-07-2014:16:00【问题描述】:考虑以下示例:SETNOCOUNTON;CREATETABLE#Users(IDINTIDENTITY(1,1),NameVARCHAR(50));CREATECLUSTEREDI... 查看详情

如何提高 boost interval_map 查找的性能

】如何提高boostinterval_map查找的性能【英文标题】:Howtoimproveperformanceofboostinterval_maplookups【发布时间】:2014-11-2615:24:26【问题描述】:我正在使用boost::icl::interval_map将字节范围映射到一组字符串。地图是从(排序的)磁盘文件中... 查看详情

如何优化数据库,如何提高数据库的性能?

解答: 1)硬件调整性能最有可能影响性能的是磁盘和网络吞吐量,解决办法扩大虚拟内存,并保证有足够可以扩充的空间;把数据库服务器上的不必要服务关闭掉;把数据库服务器和主域服务器分开;把SQL数据库服务器的吞... 查看详情

爬虫提高性能:串行线程进程异步非阻塞

阅读目录一背景知识二同步、异步、回调机制三高性能一背景知识  爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能... 查看详情

分组前排序可以使用聚合框架提高 Mongo 中的查询性能吗?

】分组前排序可以使用聚合框架提高Mongo中的查询性能吗?【英文标题】:CansortingbeforegroupingimprovequeryperformanceinMongousingtheaggregateframework?【发布时间】:2017-02-1420:54:38【问题描述】:我正在尝试汇总14-15个月期间100个帐户的数据... 查看详情