Qt 5.3 Webkit QWebView中的Javascript太慢了,在Windows上挂了MainWindow

Posted

技术标签:

【中文标题】Qt 5.3 Webkit QWebView中的Javascript太慢了,在Windows上挂了MainWindow【英文标题】:Javascript in Qt 5.3 Webkit QWebView is too slow, and hang the MainWindow on Windows 【发布时间】:2014-08-14 02:49:04 【问题描述】:

使用 Qt 5.3(预编译安装程序),Win7 x64,我使用 Qt 的 QWebView 来显示 html 页面。 HTML 将执行一个 javascript,它将初始化一个大变量。

slow.html:

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function do_load() 
    var script = document.createElement('script');
    script.src = "slow.js";
        document.getElementsByTagName('head')[0].appendChild(script);

</script>
</head>
<body>
<input class="btn" type="button" onclick="do_load()" value="load">
</body>
</html>

slow.js:

if (!window.console) 
    window.console = ;

// union of Chrome, FF, IE, and Safari console methods
var m = [
"log", "info", "warn", "error", "debug", "trace", "dir", "group",
"groupCollapsed", "groupEnd", "time", "timeEnd", "profile", "profileEnd",
"dirxml", "assert", "count", "markTimeline", "timeStamp", "clear"
];
// define undefined methods as noops to prevent errors
for (var i = 0; i < m.length; i++) 
    if (!window.console[m[i]]) 
            window.console[m[i]] = function() ;
        
 

console.log("begin to init var....");
console.time("init_var");
var HSCARDS= xxx: yyy........  // Big variable, about 800 KBytes.
console.timeEnd("init_var");

console.log("end init var....");

(完整代码可在:https://gist.github.com/vls/24b8c70fa83b9d88830a

在 Chrome 36 中,变量初始化大约需要 10 毫秒,在 IE 9 中也很快(由于 IE 9 中缺少 console.time,没有准确的时间数据) p>

但在 Windows 上的 QWebView 中,它将花费大约 10000 毫秒(发布模式,未连接 IDE)。由于 QWebView 对象在主线程中,这将挂起 MainWindow。 (在装有 Qt 5.3 的 Mac 上,这将花费大约 2000 毫秒,BUTNOT 挂起 MainWindow)

问题:

    如何避免javascript执行挂起Windows上的MainWindow?

    为什么QWebView中的javascript执行这么慢?

【问题讨论】:

我遇到了类似的问题,并且对如何改进此问题的任何想法非常感兴趣。 【参考方案1】:

为了在 JavaScript 上获得正确的速度,您需要在发布时进行优化:

将以下代码添加到您的 QtCreator 项目 (.pro)

QMAKE_CXXFLAGS_RELEASE += -Ofast

就我而言,这解决了问题。

【讨论】:

以上是关于Qt 5.3 Webkit QWebView中的Javascript太慢了,在Windows上挂了MainWindow的主要内容,如果未能解决你的问题,请参考以下文章

使用 QWebview 会产生编译错误,但不是因为 .pro 文件中缺少 Qt += webkit

QWebView加载网页

Qt 4.6 将对象和子对象添加到 QWebView 窗口对象(C++ 和 Javascript)

使用 QGraphicsWebView 比使用 QWebView 有啥优势?

QT 从 QWebView 的 QNetworkAccessManager 读取数据

QT 5.1.1:QWebview 中的复选框在 Win 7 (x64) / Win 8 下显示奇怪的行为