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 フレーム/秒)。これをどのように最適化できますか?

Web でいくつかの推奨事項を見つけましたが、どれも大きな違いはありません。

  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 に答える