1

这是一个简单的DataGrid基准:

open System.Windows

let mutable i = 0
let timer = System.Diagnostics.Stopwatch.StartNew()

[<System.STAThreadAttribute>]
do
  let grid = Controls.DataGrid()
  grid.AutoGenerateColumns <- false
  for i in 1..50 do
    let c = Controls.DataGridTextColumn()
    c.Binding <- Data.Binding()
    c.Header <- string i
    grid.Columns.Add c
  grid.ItemsSource <- Array.init 1000 string
  let window = Window(Content=grid)
  window.WindowState <- WindowState.Maximized
  Media.CompositionTarget.Rendering.Add(fun _ ->
    i <- i + 38
    grid.ScrollIntoView grid.Items.[i % 1000]
    window.Title <- sprintf "%gfps" (float i / timer.Elapsed.TotalSeconds / 38.0)
    if i > 10000 then
      i <- 1
      timer.Restart())
  Application().Run window
  |> ignore

我从中获得了糟糕的性能(在 4x 3.4GHz Intel Core i7 上为 6 帧/秒)。如何优化?

我在网上找到了一些建议,但没有一个有任何显着差异:

  grid.EnableColumnVirtualization <- true
  grid.EnableRowVirtualization <- true
  grid.ColumnWidth <- Controls.DataGridLength 27.0
  grid.RowHeight <- 18.0
  ...
    if i=0 then
      let border = Media.VisualTreeHelper.GetChild(grid, 0) :?> Controls.Border
      let scroll = border.Child :?> Controls.ScrollViewer
      scroll.IsDeferredScrollingEnabled <- true
4

1 回答 1

1

我确定您已经考虑过这一点,但是您确定您没有使用调试器,因为关闭它可以显着提高性能

编辑

好的,您为什么不尝试使用调度计时器。这可以在单独的线程上运行,因此理论上可以提高性能

于 2016-11-21T19:52:06.817 回答