我们正在开发一个使用SWT的Java应用程序,它提供了虚拟表。在Windows和OSX上,允许在100到10M之间切换表行数的测试代码在100ms以内,但在Ubuntu 16.04上需要几秒钟。现在我们想知道这是SWT的GTK实现还是GTK本身的缺点?在后一种情况下,GTK 2和GTK 3有区别吗?GTK 2/3是否支持高效的虚拟表?
1
A
回答
3
TLDR:不幸的是,GTK的GtkTreeView似乎并不支持虚拟模式可言的,它的方式,对大量的项目非常低效的实现。 SWT选择使用GtkTreeView
执行Table
,并引入了更多性能问题。
SWT Table.setItemCount()
来源为Table.setItemCount()
:
- 库:
http://git.eclipse.org/gitroot/platform/eclipse.platform.swt.git
- 源文件:
eclipse.platform.swt\bundles\org.eclipse.swt\Eclipse SWT\gtk\org\eclipse\swt\widgets\Table.java
- 查找:
public void setItemCount (int count) {
你会看到,即使在VIRTUAL
模式,setItemCount
将分配的所有项目,一次一个,使用OS.gtk_list_store_append()
:
for (int i=itemCount; i<count; i++) {
OS.gtk_list_store_append (modelHandle, iter);
}
SWT OS.gtk_list_store_append
来源为OS.gtk_list_store_append
:
- 储存库:
http://git.eclipse.org/gitroot/platform/eclipse.platform.swt.git
- 源文件:
eclipse.platform.swt\bundles\org.eclipse.swt\Eclipse SWT\gtk\org\eclipse\swt\widgets\Table.java
- 查找:
public static final void gtk_list_store_append(long /*int*/ list_store, long /*int*/ iter) {
这里,每个项目一锁获取和释放和本地方法被调用。我想他们应该至少用一个本地电话分配所有项目。
public static final void gtk_list_store_append(long /*int*/ list_store, long /*int*/ iter) {
lock.lock();
try {
_gtk_list_store_append(list_store, iter);
} finally {
lock.unlock();
}
}
GTK gtk_list_store_append
- 库:
git://git.gnome.org/gtk+
- 源文件:
gtk/gtkliststore.c
- 查找:
gtk_list_store_append (GtkListStore *list_store,
它只是调用gtk_list_store_insert(list_store, iter, -1)
GTK gtk_list_store_insert
- 库:
git://git.gnome.org/gtk+
- 源文件:
gtk/gtkliststore.c
- 查找:
gtk_list_store_insert (GtkListStore *list_store,
的关键作用是g_sequence_insert_before
是插入到一个gsequence,这是一个平衡的树。
void
gtk_list_store_insert (GtkListStore *list_store,
GtkTreeIter *iter,
gint position)
{
GtkListStorePrivate *priv;
GtkTreePath *path;
GSequence *seq;
GSequenceIter *ptr;
gint length;
g_return_if_fail (GTK_IS_LIST_STORE (list_store));
g_return_if_fail (iter != NULL);
priv = list_store->priv;
priv->columns_dirty = TRUE;
seq = priv->seq;
length = g_sequence_get_length (seq);
if (position > length || position < 0)
position = length;
ptr = g_sequence_get_iter_at_pos (seq, position);
ptr = g_sequence_insert_before (ptr, NULL);
iter->stamp = priv->stamp;
iter->user_data = ptr;
g_assert (iter_is_valid (iter, list_store));
priv->length++;
path = gtk_tree_path_new();
gtk_tree_path_append_index (path, position);
gtk_tree_model_row_inserted (GTK_TREE_MODEL (list_store), path, iter);
gtk_tree_path_free (path);
}
不幸的是,这个函数很多事情是不是一个大容量插入期间必要,例如它计算序列的长度(其具有非平凡的时间复杂度)每次转换索引来迭代器,火灾更新通知的树,等等等等
我搜索,但没有发现对于批量插入任何东西。
Windows实现
Windows实现的Table
使用OS提供的ListView
控制,其有效地用于虚拟模式下实现(见LVS_OWNERDATA
)
相关问题
- 1. Qt是否支持虚拟纯插槽?
- 2. Lazarus是否支持TListBox虚拟模式?
- 3. Vertica是否支持虚拟列?
- 4. Emacs 23是否支持prog-mode-hook?
- 5. 确定我的PC是否支持硬件虚拟化
- 6. Apache2是否支持子域的虚拟主机?
- 7. 虚拟化支持x86 debugctl
- 8. Android支持虚拟内存
- 9. iPhone和ipad是否支持QTVR(QuickTime虚拟现实)
- 10. VS代码是否支持虚拟空间?
- 11. Websphere是否支持虚拟目录映射?
- 12. Python PyGtk虚拟键盘支持at-spi
- 13. DAG是否有支持高效编辑的数据结构?
- 14. Android是否支持手表支持NFC
- 15. 由VCS支持的Apache虚拟目录?
- 16. Bluemix上的虚拟主机支持 - CloudAMQP
- 17. 效率最高的SSIS虚拟组件
- 18. iPad 4.3模拟器是否支持UIKeyboardAppearanceAlert?
- 19. SWT的虚拟表是否发布TableItems
- 20. 虚拟表的顺序是否重要?
- 21. 缺少支持库V7 23
- 22. Cordova android 4.1.0是否支持Android API级别23?
- 23. LuaJIT是否支持表__gc?
- 24. 表单是否支持drive.revisions.list?
- 25. 阿卡是否支持高阶演员?
- 26. PHP PDO是否支持高级绑定?
- 27. pydub是否支持音高调制?
- 28. Iphone QTVR(QuickTime虚拟现实)支持
- 29. 虚拟机支持多显示器
- 30. 虚拟机规模集支持