thymeleaf测试结果很糟糕,为啥Spring还要推荐使用它?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thymeleaf测试结果很糟糕,为啥Spring还要推荐使用它?相关的知识,希望对你有一定的参考价值。
一个产品的发行就算再差,也都会有它的优点和缺点,就只是在于你看它对于那个方面,所以一个产品的发行你要客观的去认识它,都有必要大体看待。对于thymeleaf的测试结果很糟糕,但是spring去推荐使用它,肯定是有好处的。
首先主要是thymeleaf的实现机制相较于其他模板引擎更加的优雅。由于各种绑定与控制采用属性的方式,绑定的机制可以采用属性的方式,你就试想一下,你打游戏有属性加成是不是很好用的,你有属性加成就会有可以使得模板不破坏html原有的语法结构,那么就会有不一样的效果,这样就获得了其他模板引擎没有的一个重要特性:thymeleaf定义的模板是可以被正常渲染的。那么这样你改模板和测试就会非常方便,你是不是就会更好操作,这是有利的。
其次就是Thymeleaf 的生产力比较好。它的生产能力非常强,它的标签比较简单,最大的优点,那么就是非常好的,所以要正确看待,它允许前端人员即时查看静态页面的效果,有的制造商时没有其它模板做不到的功能。所以你要学会考虑到横向添加服务很方便,那么你就意想不到,所以效率并不是什么大问题。
它的性能不是唯一指标,也就是让它一定能力,除此外还需要考虑开发效率它们的测试效率用户体验等等,比如你想减少内部的服务器资源消耗,完全可以把大部分渲染工作丢给用户浏览器,对他来的可能也就有一点点卡,那你就不好去考虑,所以你就会考虑其他的,毕竟要好的才会有人去推荐,不然谁会推荐。
参考技术A 主要是thymeleaf的实现机制相较于其他模板引擎更加的优雅。由于各种绑定与控制采用属性的方式,可以使得模板不破坏html原有的语法结构。 参考技术B 因为虽然测试结果很糟糕,但是总的来说还是比其它的要好许多,所以目前推荐使用它也是挺正常的。 参考技术C 我认为,虽然他的测试结果非常糟糕,但是官方说明了,3.0版本的重点是性能有非常显著的提升,因此Spring才去推荐使用它。为啥传统模式下的 syscall/sysret 被认为是“设计得很糟糕”?
【中文标题】为啥传统模式下的 syscall/sysret 被认为是“设计得很糟糕”?【英文标题】:Why syscall/sysret in legacy mode is considered "sufficiently poorly designed"?为什么传统模式下的 syscall/sysret 被认为是“设计得很糟糕”? 【发布时间】:2020-08-25 14:32:31 【问题描述】:见https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64_compat.S中的cmets
我了解由于 32 位系统调用/系统调用不保存/恢复 ESP,因此有必要在任务门中处理 NMI 以确保良好的堆栈指针。除此之外,操作系统采用它的其他障碍是什么?是否有操作系统支持它或所有操作系统都使用 sysenter/sysexit 在 32 位传统模式下进行快速系统调用?
【问题讨论】:
【参考方案1】:注意:我从未处理过旧版 syscall
是仅 AMD 指令。
旧版syscall
的主要问题是它需要某种形式的 per-cpu 空间来保存当前寄存器。
如您所知,操作系统无法将寄存器保存在堆栈中(因为ESP
不会被指令更改),也无法在保存当前堆栈之前设置不同的堆栈。
在单 CPU 系统(即单处理器系统,即无 SMP 有或没有超线程)中,操作系统可以将当前寄存器保存在内存中已知的固定位置。mov DWORD [0badf00dh], esp
之类的指令将地址编码为立即数,因此无需预先设置架构寄存器。
但是,这在 SMP 系统上不起作用,在这些系统中,所有 CPU 共享相同的代码,除非操作系统为所有 CPU 使用相同的内存区域(序列化对其的访问)。
请注意,您不能加载 per-cpu 指针,因为这必然会覆盖某些寄存器。
另一个重要的一点是旧版syscall
不会保存eflags
,这使得编写它的处理程序就像在蛋壳上行走一样。
此外,该指令还将VM
和IF
任意设置为零,使得编写可重入代码变得更加困难。
一种解决方法是使用调用约定:操作系统可以在调用过程中将一个寄存器(或几个)标记为易失性(例如 ecx
已经是)。
问题是您最终可能会节省比您想象的更多的寄存器,从而使性能增益变薄。
另一个令人难以置信的解决方法可能是在运行时为每个 CPU 组装 syscall
的入口点(基本上,只是修补 moffset
s 字段),但这非常hacky。
在 64 位模式下,操作系统可以依靠 swapgs
拥有一个 per-cpu 指针(或更准确地说,是一个 per-cpu 基地址)来存储当前寄存器。
由于swapgs
从 MSR 加载,因此可以在操作系统初始化期间提前设置。
请注意,在 64 位系统上,操作系统也可以使用上层 GPR,就像 Linux 一样,将esp
保存到例如r8d
。
这在处理 32 位兼容模式程序时有效。
长话短说:旧版syscall
让操作系统很难将当前上下文保存在每个 CPU 的内存区域中。
【讨论】:
谢谢玛格丽特!非常全面的答案。还有一个问题:eflags
问题是否也适用于sysenter
?
@Zuxy 如果堆栈是健全的,你可以简单地做一个pushf(d)
来解决这个问题:)以上是关于thymeleaf测试结果很糟糕,为啥Spring还要推荐使用它?的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个 Spring Boot/Thymeleaf 按钮会隐藏我的数据或根本不起作用?
Intellij - thymeleaf 在 kotlintest 上吓坏了
为啥我的课程架构在 fastAPi 和 swagger 中看起来很糟糕?
为啥传统模式下的 syscall/sysret 被认为是“设计得很糟糕”?