mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-26 01:35:08 +02:00
LibWeb: Add specialized fast_is for lists
Before:
`is<HTMLOLListElement>` and other similar calls in this commit
are resolved to `dynamic_cast`, which incurs runtime overhead
for resolving the type. The Performance hit becomes apparent
when rendering large lists. Callgrind analysis points to a
significant performance hit from calls to `is<...>` in
`Element::list_owner`.
Reference: Michael Gibbs and Bjarne Stroustrup (2006) Fast dynamic
casting. Softw. Pract. Exper. 2006; 36:139–156
After:
Implement inline `fast_is` virtual method that immediately
resolves the type. Results in noticeable performance improvement
2x-ish for lists with 20K entries.
Bonus: Convert starting value for LI elements to signed integer
The spec requires the start attribute and starting value to be
"integer". Firefox and Chrome support a negative start attribute.
FIXME: At the time of this PR, about 134 other objects resolve
`is<...>` to `dynamic_cast`. It may be a good idea to coordinate
similar changes to at least [some of] the ones that my have impact
on performance (maybe open a new issue?).
This commit is contained in:
committed by
Sam Atkins
parent
12c9da2d3f
commit
d27b43c1ee
Notes:
github-actions[bot]
2025-06-16 11:46:35 +00:00
Author: https://github.com/manuel-za Commit: https://github.com/LadybirdBrowser/ladybird/commit/d27b43c1eeb Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4442 Reviewed-by: https://github.com/AtkinsSJ ✅ Reviewed-by: https://github.com/InvalidUsernameException Reviewed-by: https://github.com/R-Goc Reviewed-by: https://github.com/skyz1 ✅
@@ -21,6 +21,8 @@ public:
|
||||
// https://www.w3.org/TR/html-aria/#el-menu
|
||||
virtual Optional<ARIA::Role> default_role() const override { return ARIA::Role::list; }
|
||||
|
||||
virtual bool is_html_menu_element() const override { return true; }
|
||||
|
||||
private:
|
||||
HTMLMenuElement(DOM::Document&, DOM::QualifiedName);
|
||||
|
||||
@@ -28,3 +30,10 @@ private:
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace Web::DOM {
|
||||
|
||||
template<>
|
||||
inline bool Node::fast_is<Web::HTML::HTMLMenuElement>() const { return is_html_menu_element(); }
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user