- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不明白,为什么HTML / Web UI响应比WinForms / WPF / Android View / Native UI慢?
与Web UI的CSS,DOM,javascript事件相比,Native UI还具有样式,元素嵌套,事件。
事件响应时间包括:焦点更改,下拉菜单,滚动,动画移动,动画大小调整等。
DOM树的插入/替换也很慢,在Android 4.0中的Google chrome中插入10000个字符的html将花费100毫秒,而解析其模板仅花费20毫秒(jQuery micro template)。
我认为慢速事件响应的最大因素可能是:
并行javascript进程之间的UI锁定;
呈现引擎太慢,无法处理来自javascript worker的新UI更改消息,尤其是当浏览器呈现引擎正忙于最后一次UI更新时(由于第3点);
html布局方法(例如:css级联,内联流布局,响应式布局等)可能会减慢部分UI更新的速度。
解析html / xml需要花费很长时间,这提示:Android视图膨胀严重依赖于在构建时完成的XML文件的预处理(http://developer.android.com/reference/android/view/LayoutInflater.html)
HTML和CSS标准的子集可能是Webview应用程序开发的未来解决方案:
http://www.silexlabs.org/haxe/cocktail/
http://www.terrainformatica.com/htmlayout/
http://www.nativecss.com/
http://www.pixate.com/
https://github.com/tombenner/nui
http://steelratstory.com/steelrat-products/wrathwebkit
http://trac.webkit.org/wiki/EFLWebKit
https://github.com/WebKitNix/webkitnix
http://qt-project.org/doc/qt-4.8/richtext-html-subset.html
http://sealedabstract.com/rants/why-mobile-web-apps-are-slow/
一堆本机UI标记语言:http://en.wikipedia.org/wiki/User_interface_markup_language
为什么没有简化的HTML标准和简化的Webcore布局引擎来替代这些本机UIML?
也许我们可以在kivy.org项目中实现html的子集。
PC,Android浏览器=应用程序线程+ ui线程
iOS浏览器=应用程序线程+ ui数据线程+ ui硬件线程(CoreAnimation / OpenGL ES)
在ios浏览器中,应用程序线程可以直接调用ui硬件线程。
最佳答案
如果Web UI完全由客户端的JavaScript实现,则与WinForms / Native UI的区别将是微不足道的。
但是,在大多数情况下,Web UI会触发对Web服务器的一些Web请求,然后它必须经过以下步骤才能获得与WinForms / Native应用程序相同的效果:
将HTTP请求(GET / POST / ...)发送到Web服务器
Web服务器是侦听一个或多个端口的可执行文件(采用外部应用程序或服务的格式)。当它收到请求时,对其进行解析,然后找到Web应用程序。
Web服务器在应用程序内执行后端(服务器端)逻辑。
诸如ASP.NET之类的Web应用程序已预先编译。此步骤的时间复杂度可能非常接近Windows应用程序。
Web服务器将结果呈现到标记中并将其发送回客户端
客户端(浏览器)解析结果并在必要时更新UI。
网页中的控件/图像/其他资源在浏览器中的呈现时间通常比Windows应用程序呈现其显示时间更长。
即使Web服务器是本地服务器,也无法简单地忽略数据解析/格式化/传输所产生的成本。
另一方面,具有WinForms / Native UI的应用程序通常会维护一个消息循环,该循环是活动的并托管在机器代码中。 UI请求通常仅触发消息表中的查找,然后执行后端逻辑(上述步骤2)
当它返回结果并更新UI时,它可以只是二进制数据结构(不需要在标记中),并且不答复另一个应用程序(浏览器)以呈现到屏幕。
最后,WinForms / Native应用程序通常具有完全控制权,可以维护多个线程以逐步更新UI,而Web应用程序不能直接控制这种服务器端资源。
更新:当我们比较一个使用相同Web服务的Web应用程序和Windows / WPF(或本机)应用程序以部分更新其UI时
这两个UI应该以可忽略的速度差异进行响应和刷新。响应和刷新UI的二进制和脚本执行之间的实现差异几乎没有。
这两个UI都不需要重建控制树并刷新整个外观。在相同条件下,它们在进程/线程级别可能具有相同的CPU优先级,内存/虚拟内存缓存以及相同/接近数量的内核对象和GDI句柄。
如您所描述的,在这种情况下,几乎没有视觉差异。
更新2:
实际上,Web和Windows应用程序中的事件处理机制是相似的。 DOM具有事件冒泡。同样,MFC具有命令路由。 Winforms有其事件流; WPF具有事件冒泡和隧道化等等。这个想法是UI事件可能并不严格地属于一个控件,并且控件具有某种方法可以声明事件已“处理”。对于标准控件,Web和Windows应用程序的焦点更改,文本更改,下拉菜单,滚动事件应具有相似的客户端响应时间。
在性能方面,渲染是最大的不同。 Web应用程序对“设备上下文”的控制有限,因为Web页是由外部应用程序(即Web浏览器)托管的。 Windows应用程序可以使用WPF等GPU资源来实现动画效果,并通过部分刷新“设备上下文”来加快渲染速度。这就是HTML5画布使Web开发人员兴奋的原因,而Windows游戏开发人员使用OpenGL / DirectX已有10多年了。
更新3:
每个Web浏览器引擎(http://en.wikipedia.org/wiki/Layout_engine)都有其自己的呈现DOM,CSS的实现; (CSS)选择器的实现。在网页中移动和调整元素大小正在更改DOM,CSS(树)设置。选择器和呈现性能在很大程度上取决于Web浏览器引擎。
UI操作可能会使选择器执行不必要的步骤来更新UI。
网页没有控制权通知浏览器进行部分渲染。
这使得精美的JavaScript控件(某些jQuery UI,dojo,Ext JS)不能实时快速,通常比Flash控件慢。
关于mobile - 为什么HTML/Web UI响应比 native UI慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10731934/
我正在尝试检查 Entry 中是否存在重复项,并使用内联消息提醒用户该数字存在。 $(document).ready(function(){ $("#con1").blur(function(
我有一个基于类的 View 。我在引导模式上使用 Ajax。为了避免页面刷新,我想使用此类基于 View 返回 JSON 响应而不是 HTTP 响应,但我只看到了如何为基于函数的 View 返回 JS
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个大型内部企业基于 Web 的应用程序在 IIS6 上运行 ASP.NET 3.5,生成 401 个“未经授权”响应,然后是 200 个“Ok”响应(如 Fiddler 所述)。我知道为什么会发
感谢您研究我的问题。 我有一个node/express服务器,配置了一个server.js文件,它调用urls.js,而urls.js又调用 Controller 来处理http请求,所有这些都配置相
当我使用以下命令时,我得到正确的 JSON 响应: $ curl --data "regno=&dob=&mobile=" https://vitacademics-rel.herokuapp.co
我有一个非常简单的 RESTful 服务,它通过 POST 接收一些表单数据,其目的是在云存储(Amazon S3、Azure Blob 存储等)中简单地保留文本主体(具有唯一 ID)作为一个文件..
UDP 不发送任何 ack,但它会发送任何响应吗? 我已经设置了客户端服务器UDP程序。如果我让客户端向不存在的服务器发送数据,那么客户端会收到任何响应吗? 我的假设是; 客户端 --> 广播服务器地
我有一个电梯项目,其中 有一个扩展 RestHelper 的类,看起来像这样 serve{ "api" / "mystuff" prefix { case a
我们正在寻求覆盖 Kong 错误响应结构并编写自定义消息(即用我们的自定义消息替换“超出 API 速率限制”、“无效的身份验证凭据”等)。 我们要找的错误响应结构(代码是自定义的内部错误代码,与HTT
我正在尝试监听 EKEventStoreChangedNotification 以检查当我的应用程序处于后台时日历是否已更改。 我在 View Controller 的 initWithNibMeth
我了解 javascript,并且正在学习 ASP.NET C# 我想要做什么(完成的是javascript): document.getElementById('divID-1'
是否可以过滤所有 har 对象并仅获取 POST 请求/响应?也许在初始化 BrowserMobProxyServer 期间是这样做的方法?我需要将 har 对象保存到文件中并上传到 har 查看器。
我正在尝试向 Oauth 的 API 发送响应。遗憾的是,Symfony2 文档在解释 $response->headers->set(...); 的所有不同部分方面做得很差。 这是我的 OauthC
我正在尝试测试用例来模拟 api 调用,并使用 python 响应来模拟 api 调用。 下面是我的模拟, with responses.RequestsMock() as rsps: url
在尝试在 Haskell 中进行一些领域驱动设计时,我发现自己遇到了这个问题: data FetchAccessories = FetchAccessories data AccessoriesRes
我正在与 ANT+ USB 棒连接,并用项目 react 器替换我自己天真的“MessageBus”,因为它看起来非常合适。 USB接口(interface)本质上是异步的(单独的输入/输出管道),我
我正在将项目迁移到AFNetworking 2.0。使用AFNetworking 1.0时,我编写了代码来记录控制台中的每个请求/响应。这是代码: -(AFHTTPRequestOperation *
我有以下代码段。 ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState == 4){
我有问题......我在 php 中有一个监听器脚本可以执行以下操作: if ($count != 1) {echo 'no';} else { echo "yes";} 因此它会回显"is"或“
我是一名优秀的程序员,十分优秀!