Skip to content

Repository files navigation

FastCode

Fast replacements for Embarcadero's standard libs for Delphi XE7 and above.
Note that this is still early alpha code and needs further optimization in places.
A comprehensive testsuite is available in the Test directory.

System.Generics.FastDefaults (New)

Drop-in replacement for System.Generics.Defaults
This will not speed up trivial compares like integer and char, but e.g. the string comparisons in 64-bit are 8x faster.
Every comparison is optimized as much as possible. The following QC's have been fixed:
RSP-11321 Inconsistent compare with 8 bytes record https://quality.embarcadero.com/browse/RSP-11321
RSP-11310 incorrect results when comparing with an empty dynamic array https://quality.embarcadero.com/browse/RSP-11310
RSP-11301 comparing real48 gives AV or stack corruption https://quality.embarcadero.com/browse/RSP-11301

FastDefaults

Speeds up comparisons by using static class functions instead of interfaces.
The functions are inline and inject only the short snippet of code need to compare the types in use.

It does this by resolving the type at compile-time using the new GetTypeKind and TypeInfo compiler intrinsics in XE7.
Then it inlines just the code snippet needed.
It also uses much more optimized code than the RTL; this is especially true for Win64 which has not been blessed by the 2007 FastCode project.

#QuickerSort
Adds class helper for TArray<T> that uses a more optimized version of quicksort.

#Examples

FastDefault

var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
//no overhead for one shot use.
RFast:= FastDefaults.TComparer<integer>.Default.Compare(i1,i2);
if RFast = 0 then Readln;
end.

CompareFast: even faster. If you don't need a generic comparer, you can use the CompareFast versions which will work much faster, because they work directly with register operands and are not forced to go via the stack.
Even for simple types like cardinals the CompareFast code is likely to be faster than a naive implementation.

 var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
RFast:= CompareFast(i1,i2);
...

Generated code

Project44.dpr.13: I1:= 1;
00433B31 B801000000 mov eax,$00000001
Project44.dpr.14: I2:= 2;
00433B36 BA02000000 mov edx,$00000002
Project44.dpr.15: Result:= CompareFast(i1,i2);
00433B3B 8BD8 mov ebx,eax
00433B3D 2BDA sub ebx,edx
...

About

Fast replacements for Embarcadero's standard libs

Resources

Stars

58 stars

Watchers

18 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - JBontes/FastCode: Fast replacements for Embarcadero's standard libs · GitHub
Skip to content

Repository files navigation

FastCode

Fast replacements for Embarcadero's standard libs for Delphi XE7 and above.
Note that this is still early alpha code and needs further optimization in places.
A comprehensive testsuite is available in the Test directory.

System.Generics.FastDefaults (New)

Drop-in replacement for System.Generics.Defaults
This will not speed up trivial compares like integer and char, but e.g. the string comparisons in 64-bit are 8x faster.
Every comparison is optimized as much as possible. The following QC's have been fixed:
RSP-11321 Inconsistent compare with 8 bytes record https://quality.embarcadero.com/browse/RSP-11321
RSP-11310 incorrect results when comparing with an empty dynamic array https://quality.embarcadero.com/browse/RSP-11310
RSP-11301 comparing real48 gives AV or stack corruption https://quality.embarcadero.com/browse/RSP-11301

FastDefaults

Speeds up comparisons by using static class functions instead of interfaces.
The functions are inline and inject only the short snippet of code need to compare the types in use.

It does this by resolving the type at compile-time using the new GetTypeKind and TypeInfo compiler intrinsics in XE7.
Then it inlines just the code snippet needed.
It also uses much more optimized code than the RTL; this is especially true for Win64 which has not been blessed by the 2007 FastCode project.

#QuickerSort
Adds class helper for TArray<T> that uses a more optimized version of quicksort.

#Examples

FastDefault

var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
//no overhead for one shot use.
RFast:= FastDefaults.TComparer<integer>.Default.Compare(i1,i2);
if RFast = 0 then Readln;
end.

CompareFast: even faster. If you don't need a generic comparer, you can use the CompareFast versions which will work much faster, because they work directly with register operands and are not forced to go via the stack.
Even for simple types like cardinals the CompareFast code is likely to be faster than a naive implementation.

 var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
RFast:= CompareFast(i1,i2);
...

Generated code

Project44.dpr.13: I1:= 1;
00433B31 B801000000 mov eax,$00000001
Project44.dpr.14: I2:= 2;
00433B36 BA02000000 mov edx,$00000002
Project44.dpr.15: Result:= CompareFast(i1,i2);
00433B3B 8BD8 mov ebx,eax
00433B3D 2BDA sub ebx,edx
...

About

Fast replacements for Embarcadero's standard libs

Resources

Stars

58 stars

Watchers

18 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - JBontes/FastCode: Fast replacements for Embarcadero's standard libs · GitHub
Skip to content

Repository files navigation

FastCode

Fast replacements for Embarcadero's standard libs for Delphi XE7 and above.
Note that this is still early alpha code and needs further optimization in places.
A comprehensive testsuite is available in the Test directory.

System.Generics.FastDefaults (New)

Drop-in replacement for System.Generics.Defaults
This will not speed up trivial compares like integer and char, but e.g. the string comparisons in 64-bit are 8x faster.
Every comparison is optimized as much as possible. The following QC's have been fixed:
RSP-11321 Inconsistent compare with 8 bytes record https://quality.embarcadero.com/browse/RSP-11321
RSP-11310 incorrect results when comparing with an empty dynamic array https://quality.embarcadero.com/browse/RSP-11310
RSP-11301 comparing real48 gives AV or stack corruption https://quality.embarcadero.com/browse/RSP-11301

FastDefaults

Speeds up comparisons by using static class functions instead of interfaces.
The functions are inline and inject only the short snippet of code need to compare the types in use.

It does this by resolving the type at compile-time using the new GetTypeKind and TypeInfo compiler intrinsics in XE7.
Then it inlines just the code snippet needed.
It also uses much more optimized code than the RTL; this is especially true for Win64 which has not been blessed by the 2007 FastCode project.

#QuickerSort
Adds class helper for TArray<T> that uses a more optimized version of quicksort.

#Examples

FastDefault

var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
//no overhead for one shot use.
RFast:= FastDefaults.TComparer<integer>.Default.Compare(i1,i2);
if RFast = 0 then Readln;
end.

CompareFast: even faster. If you don't need a generic comparer, you can use the CompareFast versions which will work much faster, because they work directly with register operands and are not forced to go via the stack.
Even for simple types like cardinals the CompareFast code is likely to be faster than a naive implementation.

 var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
RFast:= CompareFast(i1,i2);
...

Generated code

Project44.dpr.13: I1:= 1;
00433B31 B801000000 mov eax,$00000001
Project44.dpr.14: I2:= 2;
00433B36 BA02000000 mov edx,$00000002
Project44.dpr.15: Result:= CompareFast(i1,i2);
00433B3B 8BD8 mov ebx,eax
00433B3D 2BDA sub ebx,edx
...

About

Fast replacements for Embarcadero's standard libs

Resources

Stars

58 stars

Watchers

18 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - JBontes/FastCode: Fast replacements for Embarcadero's standard libs · GitHub
Skip to content

Repository files navigation

FastCode

Fast replacements for Embarcadero's standard libs for Delphi XE7 and above.
Note that this is still early alpha code and needs further optimization in places.
A comprehensive testsuite is available in the Test directory.

System.Generics.FastDefaults (New)

Drop-in replacement for System.Generics.Defaults
This will not speed up trivial compares like integer and char, but e.g. the string comparisons in 64-bit are 8x faster.
Every comparison is optimized as much as possible. The following QC's have been fixed:
RSP-11321 Inconsistent compare with 8 bytes record https://quality.embarcadero.com/browse/RSP-11321
RSP-11310 incorrect results when comparing with an empty dynamic array https://quality.embarcadero.com/browse/RSP-11310
RSP-11301 comparing real48 gives AV or stack corruption https://quality.embarcadero.com/browse/RSP-11301

FastDefaults

Speeds up comparisons by using static class functions instead of interfaces.
The functions are inline and inject only the short snippet of code need to compare the types in use.

It does this by resolving the type at compile-time using the new GetTypeKind and TypeInfo compiler intrinsics in XE7.
Then it inlines just the code snippet needed.
It also uses much more optimized code than the RTL; this is especially true for Win64 which has not been blessed by the 2007 FastCode project.

#QuickerSort
Adds class helper for TArray<T> that uses a more optimized version of quicksort.

#Examples

FastDefault

var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
//no overhead for one shot use.
RFast:= FastDefaults.TComparer<integer>.Default.Compare(i1,i2);
if RFast = 0 then Readln;
end.

CompareFast: even faster. If you don't need a generic comparer, you can use the CompareFast versions which will work much faster, because they work directly with register operands and are not forced to go via the stack.
Even for simple types like cardinals the CompareFast code is likely to be faster than a naive implementation.

 var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
RFast:= CompareFast(i1,i2);
...

Generated code

Project44.dpr.13: I1:= 1;
00433B31 B801000000 mov eax,$00000001
Project44.dpr.14: I2:= 2;
00433B36 BA02000000 mov edx,$00000002
Project44.dpr.15: Result:= CompareFast(i1,i2);
00433B3B 8BD8 mov ebx,eax
00433B3D 2BDA sub ebx,edx
...

About

Fast replacements for Embarcadero's standard libs

Resources

Stars

58 stars

Watchers

18 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - JBontes/FastCode: Fast replacements for Embarcadero's standard libs · GitHub
Skip to content

Repository files navigation

FastCode

Fast replacements for Embarcadero's standard libs for Delphi XE7 and above.
Note that this is still early alpha code and needs further optimization in places.
A comprehensive testsuite is available in the Test directory.

System.Generics.FastDefaults (New)

Drop-in replacement for System.Generics.Defaults
This will not speed up trivial compares like integer and char, but e.g. the string comparisons in 64-bit are 8x faster.
Every comparison is optimized as much as possible. The following QC's have been fixed:
RSP-11321 Inconsistent compare with 8 bytes record https://quality.embarcadero.com/browse/RSP-11321
RSP-11310 incorrect results when comparing with an empty dynamic array https://quality.embarcadero.com/browse/RSP-11310
RSP-11301 comparing real48 gives AV or stack corruption https://quality.embarcadero.com/browse/RSP-11301

FastDefaults

Speeds up comparisons by using static class functions instead of interfaces.
The functions are inline and inject only the short snippet of code need to compare the types in use.

It does this by resolving the type at compile-time using the new GetTypeKind and TypeInfo compiler intrinsics in XE7.
Then it inlines just the code snippet needed.
It also uses much more optimized code than the RTL; this is especially true for Win64 which has not been blessed by the 2007 FastCode project.

#QuickerSort
Adds class helper for TArray<T> that uses a more optimized version of quicksort.

#Examples

FastDefault

var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
//no overhead for one shot use.
RFast:= FastDefaults.TComparer<integer>.Default.Compare(i1,i2);
if RFast = 0 then Readln;
end.

CompareFast: even faster. If you don't need a generic comparer, you can use the CompareFast versions which will work much faster, because they work directly with register operands and are not forced to go via the stack.
Even for simple types like cardinals the CompareFast code is likely to be faster than a naive implementation.

 var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
RFast:= CompareFast(i1,i2);
...

Generated code

Project44.dpr.13: I1:= 1;
00433B31 B801000000 mov eax,$00000001
Project44.dpr.14: I2:= 2;
00433B36 BA02000000 mov edx,$00000002
Project44.dpr.15: Result:= CompareFast(i1,i2);
00433B3B 8BD8 mov ebx,eax
00433B3D 2BDA sub ebx,edx
...

About

Fast replacements for Embarcadero's standard libs

Resources

Stars

58 stars

Watchers

18 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - JBontes/FastCode: Fast replacements for Embarcadero's standard libs · GitHub
Skip to content

Repository files navigation

FastCode

Fast replacements for Embarcadero's standard libs for Delphi XE7 and above.
Note that this is still early alpha code and needs further optimization in places.
A comprehensive testsuite is available in the Test directory.

System.Generics.FastDefaults (New)

Drop-in replacement for System.Generics.Defaults
This will not speed up trivial compares like integer and char, but e.g. the string comparisons in 64-bit are 8x faster.
Every comparison is optimized as much as possible. The following QC's have been fixed:
RSP-11321 Inconsistent compare with 8 bytes record https://quality.embarcadero.com/browse/RSP-11321
RSP-11310 incorrect results when comparing with an empty dynamic array https://quality.embarcadero.com/browse/RSP-11310
RSP-11301 comparing real48 gives AV or stack corruption https://quality.embarcadero.com/browse/RSP-11301

FastDefaults

Speeds up comparisons by using static class functions instead of interfaces.
The functions are inline and inject only the short snippet of code need to compare the types in use.

It does this by resolving the type at compile-time using the new GetTypeKind and TypeInfo compiler intrinsics in XE7.
Then it inlines just the code snippet needed.
It also uses much more optimized code than the RTL; this is especially true for Win64 which has not been blessed by the 2007 FastCode project.

#QuickerSort
Adds class helper for TArray<T> that uses a more optimized version of quicksort.

#Examples

FastDefault

var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
//no overhead for one shot use.
RFast:= FastDefaults.TComparer<integer>.Default.Compare(i1,i2);
if RFast = 0 then Readln;
end.

CompareFast: even faster. If you don't need a generic comparer, you can use the CompareFast versions which will work much faster, because they work directly with register operands and are not forced to go via the stack.
Even for simple types like cardinals the CompareFast code is likely to be faster than a naive implementation.

 var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
RFast:= CompareFast(i1,i2);
...

Generated code

Project44.dpr.13: I1:= 1;
00433B31 B801000000 mov eax,$00000001
Project44.dpr.14: I2:= 2;
00433B36 BA02000000 mov edx,$00000002
Project44.dpr.15: Result:= CompareFast(i1,i2);
00433B3B 8BD8 mov ebx,eax
00433B3D 2BDA sub ebx,edx
...

About

Fast replacements for Embarcadero's standard libs

Resources

Stars

58 stars

Watchers

18 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - JBontes/FastCode: Fast replacements for Embarcadero's standard libs · GitHub
Skip to content

Repository files navigation

FastCode

Fast replacements for Embarcadero's standard libs for Delphi XE7 and above.
Note that this is still early alpha code and needs further optimization in places.
A comprehensive testsuite is available in the Test directory.

System.Generics.FastDefaults (New)

Drop-in replacement for System.Generics.Defaults
This will not speed up trivial compares like integer and char, but e.g. the string comparisons in 64-bit are 8x faster.
Every comparison is optimized as much as possible. The following QC's have been fixed:
RSP-11321 Inconsistent compare with 8 bytes record https://quality.embarcadero.com/browse/RSP-11321
RSP-11310 incorrect results when comparing with an empty dynamic array https://quality.embarcadero.com/browse/RSP-11310
RSP-11301 comparing real48 gives AV or stack corruption https://quality.embarcadero.com/browse/RSP-11301

FastDefaults

Speeds up comparisons by using static class functions instead of interfaces.
The functions are inline and inject only the short snippet of code need to compare the types in use.

It does this by resolving the type at compile-time using the new GetTypeKind and TypeInfo compiler intrinsics in XE7.
Then it inlines just the code snippet needed.
It also uses much more optimized code than the RTL; this is especially true for Win64 which has not been blessed by the 2007 FastCode project.

#QuickerSort
Adds class helper for TArray<T> that uses a more optimized version of quicksort.

#Examples

FastDefault

var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
//no overhead for one shot use.
RFast:= FastDefaults.TComparer<integer>.Default.Compare(i1,i2);
if RFast = 0 then Readln;
end.

CompareFast: even faster. If you don't need a generic comparer, you can use the CompareFast versions which will work much faster, because they work directly with register operands and are not forced to go via the stack.
Even for simple types like cardinals the CompareFast code is likely to be faster than a naive implementation.

 var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
RFast:= CompareFast(i1,i2);
...

Generated code

Project44.dpr.13: I1:= 1;
00433B31 B801000000 mov eax,$00000001
Project44.dpr.14: I2:= 2;
00433B36 BA02000000 mov edx,$00000002
Project44.dpr.15: Result:= CompareFast(i1,i2);
00433B3B 8BD8 mov ebx,eax
00433B3D 2BDA sub ebx,edx
...

About

Fast replacements for Embarcadero's standard libs

Resources

Stars

58 stars

Watchers

18 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - JBontes/FastCode: Fast replacements for Embarcadero's standard libs · GitHub
Skip to content

Repository files navigation

FastCode

Fast replacements for Embarcadero's standard libs for Delphi XE7 and above.
Note that this is still early alpha code and needs further optimization in places.
A comprehensive testsuite is available in the Test directory.

System.Generics.FastDefaults (New)

Drop-in replacement for System.Generics.Defaults
This will not speed up trivial compares like integer and char, but e.g. the string comparisons in 64-bit are 8x faster.
Every comparison is optimized as much as possible. The following QC's have been fixed:
RSP-11321 Inconsistent compare with 8 bytes record https://quality.embarcadero.com/browse/RSP-11321
RSP-11310 incorrect results when comparing with an empty dynamic array https://quality.embarcadero.com/browse/RSP-11310
RSP-11301 comparing real48 gives AV or stack corruption https://quality.embarcadero.com/browse/RSP-11301

FastDefaults

Speeds up comparisons by using static class functions instead of interfaces.
The functions are inline and inject only the short snippet of code need to compare the types in use.

It does this by resolving the type at compile-time using the new GetTypeKind and TypeInfo compiler intrinsics in XE7.
Then it inlines just the code snippet needed.
It also uses much more optimized code than the RTL; this is especially true for Win64 which has not been blessed by the 2007 FastCode project.

#QuickerSort
Adds class helper for TArray<T> that uses a more optimized version of quicksort.

#Examples

FastDefault

var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
//no overhead for one shot use.
RFast:= FastDefaults.TComparer<integer>.Default.Compare(i1,i2);
if RFast = 0 then Readln;
end.

CompareFast: even faster. If you don't need a generic comparer, you can use the CompareFast versions which will work much faster, because they work directly with register operands and are not forced to go via the stack.
Even for simple types like cardinals the CompareFast code is likely to be faster than a naive implementation.

 var
I1, I2: integer;
RFast: integer;
begin
I1:= 1;
I2:= 2;
RFast:= CompareFast(i1,i2);
...

Generated code

Project44.dpr.13: I1:= 1;
00433B31 B801000000 mov eax,$00000001
Project44.dpr.14: I2:= 2;
00433B36 BA02000000 mov edx,$00000002
Project44.dpr.15: Result:= CompareFast(i1,i2);
00433B3B 8BD8 mov ebx,eax
00433B3D 2BDA sub ebx,edx
...

About

Fast replacements for Embarcadero's standard libs

Resources

Stars

58 stars

Watchers

18 watching

Forks

Releases

Packages

Contributors

Languages