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 毫秒,BUT 将 NOT 挂起 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
Qt 4.6 将对象和子对象添加到 QWebView 窗口对象(C++ 和 Javascript)
使用 QGraphicsWebView 比使用 QWebView 有啥优势?