829 lines
30 KiB
HTML
829 lines
30 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="hu">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>AcBinary vs MessagePack - Benchmark Riport</title>
|
||
<style>
|
||
:root {
|
||
--primary: #4f46e5;
|
||
--primary-light: #818cf8;
|
||
--success: #22c55e;
|
||
--warning: #f59e0b;
|
||
--danger: #ef4444;
|
||
--gray-50: #f9fafb;
|
||
--gray-100: #f3f4f6;
|
||
--gray-200: #e5e7eb;
|
||
--gray-300: #d1d5db;
|
||
--gray-600: #4b5563;
|
||
--gray-800: #1f2937;
|
||
--gray-900: #111827;
|
||
}
|
||
|
||
* {
|
||
margin: 0;
|
||
padding: 0;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
body {
|
||
font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
|
||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||
min-height: 100vh;
|
||
padding: 2rem;
|
||
color: var(--gray-800);
|
||
}
|
||
|
||
.container {
|
||
max-width: 1200px;
|
||
margin: 0 auto;
|
||
}
|
||
|
||
.card {
|
||
background: white;
|
||
border-radius: 16px;
|
||
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
|
||
padding: 2rem;
|
||
margin-bottom: 2rem;
|
||
}
|
||
|
||
.header {
|
||
text-align: center;
|
||
margin-bottom: 2rem;
|
||
}
|
||
|
||
.header h1 {
|
||
font-size: 2.5rem;
|
||
background: linear-gradient(135deg, var(--primary) 0%, #7c3aed 100%);
|
||
-webkit-background-clip: text;
|
||
-webkit-text-fill-color: transparent;
|
||
background-clip: text;
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
|
||
.header .subtitle {
|
||
color: var(--gray-600);
|
||
font-size: 1.1rem;
|
||
}
|
||
|
||
.header .date {
|
||
color: var(--gray-400);
|
||
font-size: 0.9rem;
|
||
margin-top: 0.5rem;
|
||
}
|
||
|
||
h2 {
|
||
color: var(--gray-800);
|
||
font-size: 1.5rem;
|
||
margin-bottom: 1.5rem;
|
||
padding-bottom: 0.5rem;
|
||
border-bottom: 3px solid var(--primary-light);
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
}
|
||
|
||
h3 {
|
||
color: var(--gray-700);
|
||
font-size: 1.2rem;
|
||
margin: 1.5rem 0 1rem;
|
||
}
|
||
|
||
table {
|
||
width: 100%;
|
||
border-collapse: collapse;
|
||
margin-bottom: 1rem;
|
||
font-size: 0.95rem;
|
||
}
|
||
|
||
th, td {
|
||
padding: 0.875rem 1rem;
|
||
text-align: left;
|
||
border-bottom: 1px solid var(--gray-200);
|
||
}
|
||
|
||
th {
|
||
background: var(--gray-50);
|
||
font-weight: 600;
|
||
color: var(--gray-700);
|
||
text-transform: uppercase;
|
||
font-size: 0.75rem;
|
||
letter-spacing: 0.05em;
|
||
}
|
||
|
||
tr:hover {
|
||
background: var(--gray-50);
|
||
}
|
||
|
||
.number {
|
||
font-family: 'Consolas', 'Monaco', monospace;
|
||
text-align: right;
|
||
}
|
||
|
||
.winner {
|
||
background: linear-gradient(90deg, rgba(34, 197, 94, 0.1) 0%, transparent 100%);
|
||
}
|
||
|
||
.winner td:first-child::before {
|
||
content: "?? ";
|
||
}
|
||
|
||
.badge {
|
||
display: inline-block;
|
||
padding: 0.25rem 0.75rem;
|
||
border-radius: 9999px;
|
||
font-size: 0.75rem;
|
||
font-weight: 600;
|
||
}
|
||
|
||
.badge-success {
|
||
background: rgba(34, 197, 94, 0.15);
|
||
color: #15803d;
|
||
}
|
||
|
||
.badge-warning {
|
||
background: rgba(245, 158, 11, 0.15);
|
||
color: #b45309;
|
||
}
|
||
|
||
.badge-danger {
|
||
background: rgba(239, 68, 68, 0.15);
|
||
color: #dc2626;
|
||
}
|
||
|
||
.badge-info {
|
||
background: rgba(79, 70, 229, 0.15);
|
||
color: var(--primary);
|
||
}
|
||
|
||
.stats-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||
gap: 1rem;
|
||
margin-bottom: 1.5rem;
|
||
}
|
||
|
||
.stat-card {
|
||
background: var(--gray-50);
|
||
border-radius: 12px;
|
||
padding: 1.25rem;
|
||
text-align: center;
|
||
border: 1px solid var(--gray-200);
|
||
}
|
||
|
||
.stat-card .value {
|
||
font-size: 2rem;
|
||
font-weight: 700;
|
||
color: var(--primary);
|
||
font-family: 'Consolas', monospace;
|
||
}
|
||
|
||
.stat-card .label {
|
||
color: var(--gray-600);
|
||
font-size: 0.85rem;
|
||
margin-top: 0.25rem;
|
||
}
|
||
|
||
.stat-card.success .value { color: var(--success); }
|
||
.stat-card.warning .value { color: var(--warning); }
|
||
.stat-card.danger .value { color: var(--danger); }
|
||
|
||
.comparison-bar {
|
||
display: flex;
|
||
height: 32px;
|
||
border-radius: 8px;
|
||
overflow: hidden;
|
||
margin: 0.5rem 0;
|
||
background: var(--gray-100);
|
||
}
|
||
|
||
.comparison-bar .segment {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
color: white;
|
||
font-size: 0.75rem;
|
||
font-weight: 600;
|
||
transition: all 0.3s ease;
|
||
}
|
||
|
||
.comparison-bar .segment:hover {
|
||
filter: brightness(1.1);
|
||
}
|
||
|
||
.segment.acbinary { background: var(--primary); }
|
||
.segment.msgpack { background: #f97316; }
|
||
|
||
.legend {
|
||
display: flex;
|
||
gap: 1.5rem;
|
||
margin-top: 0.5rem;
|
||
font-size: 0.85rem;
|
||
}
|
||
|
||
.legend-item {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
}
|
||
|
||
.legend-color {
|
||
width: 16px;
|
||
height: 16px;
|
||
border-radius: 4px;
|
||
}
|
||
|
||
.summary-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||
gap: 1.5rem;
|
||
}
|
||
|
||
.summary-item {
|
||
background: var(--gray-50);
|
||
border-radius: 12px;
|
||
padding: 1.5rem;
|
||
border-left: 4px solid var(--primary);
|
||
}
|
||
|
||
.summary-item h4 {
|
||
color: var(--gray-800);
|
||
margin-bottom: 0.75rem;
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
}
|
||
|
||
.summary-item ul {
|
||
list-style: none;
|
||
color: var(--gray-600);
|
||
font-size: 0.9rem;
|
||
}
|
||
|
||
.summary-item li {
|
||
padding: 0.25rem 0;
|
||
padding-left: 1.25rem;
|
||
position: relative;
|
||
}
|
||
|
||
.summary-item li::before {
|
||
content: "?";
|
||
position: absolute;
|
||
left: 0;
|
||
color: var(--success);
|
||
}
|
||
|
||
.env-info {
|
||
background: var(--gray-50);
|
||
border-radius: 8px;
|
||
padding: 1rem;
|
||
font-size: 0.85rem;
|
||
color: var(--gray-600);
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||
gap: 0.5rem;
|
||
}
|
||
|
||
.env-info span {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
}
|
||
|
||
.note {
|
||
background: rgba(79, 70, 229, 0.1);
|
||
border-left: 4px solid var(--primary);
|
||
padding: 1rem;
|
||
border-radius: 0 8px 8px 0;
|
||
margin: 1rem 0;
|
||
font-size: 0.9rem;
|
||
color: var(--gray-700);
|
||
}
|
||
|
||
.warning-note {
|
||
background: rgba(245, 158, 11, 0.1);
|
||
border-left: 4px solid var(--warning);
|
||
}
|
||
|
||
.optimization-item {
|
||
background: var(--gray-50);
|
||
border-radius: 8px;
|
||
padding: 1rem;
|
||
margin-bottom: 1rem;
|
||
border-left: 4px solid var(--primary);
|
||
}
|
||
|
||
.optimization-item.high {
|
||
border-left-color: var(--success);
|
||
}
|
||
|
||
.optimization-item.medium {
|
||
border-left-color: var(--warning);
|
||
}
|
||
|
||
.optimization-item.low {
|
||
border-left-color: var(--gray-300);
|
||
}
|
||
|
||
.optimization-item h4 {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 0.5rem;
|
||
margin-bottom: 0.5rem;
|
||
color: var(--gray-800);
|
||
}
|
||
|
||
.optimization-item p {
|
||
color: var(--gray-600);
|
||
font-size: 0.9rem;
|
||
margin-bottom: 0.5rem;
|
||
}
|
||
|
||
.optimization-item code {
|
||
background: var(--gray-200);
|
||
padding: 0.125rem 0.375rem;
|
||
border-radius: 4px;
|
||
font-size: 0.85rem;
|
||
}
|
||
|
||
.impact-badge {
|
||
font-size: 0.7rem;
|
||
padding: 0.125rem 0.5rem;
|
||
border-radius: 4px;
|
||
font-weight: 600;
|
||
}
|
||
|
||
.impact-high { background: rgba(34, 197, 94, 0.2); color: #15803d; }
|
||
.impact-medium { background: rgba(245, 158, 11, 0.2); color: #b45309; }
|
||
.impact-low { background: rgba(107, 114, 128, 0.2); color: var(--gray-600); }
|
||
|
||
footer {
|
||
text-align: center;
|
||
color: white;
|
||
opacity: 0.8;
|
||
padding: 1rem;
|
||
font-size: 0.85rem;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="container">
|
||
<div class="card header">
|
||
<h1>?? AcBinary vs MessagePack</h1>
|
||
<div class="subtitle">Komplett Benchmark <20>sszehasonl<6E>t<EFBFBD>s + Mem<65>ria Diagnosztika</div>
|
||
<div class="date">Gener<EFBFBD>lva: 2024. december 13. | .NET 9.0 | Intel Core i7-10750H</div>
|
||
</div>
|
||
|
||
<!-- K<>rnyezet info -->
|
||
<div class="card">
|
||
<h2>??? Teszt K<>rnyezet</h2>
|
||
<div class="env-info">
|
||
<span>?? Windows 11 (23H2)</span>
|
||
<span>?? Intel Core i7-10750H @ 2.60GHz</span>
|
||
<span>?? .NET SDK 10.0.101</span>
|
||
<span>?? Runtime: .NET 9.0.11</span>
|
||
<span>?? BenchmarkDotNet v0.15.2</span>
|
||
<span>?? Teszt adat: 3<>3<EFBFBD>3<EFBFBD>4 hierarchia</span>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- M<>ret <20>sszehasonl<6E>t<EFBFBD>s -->
|
||
<div class="card">
|
||
<h2>?? M<>ret <20>sszehasonl<6E>t<EFBFBD>s</h2>
|
||
|
||
<div class="stats-grid">
|
||
<div class="stat-card">
|
||
<div class="value">18.9 KB</div>
|
||
<div class="label">AcBinary WithRef</div>
|
||
</div>
|
||
<div class="stat-card">
|
||
<div class="value">15.8 KB</div>
|
||
<div class="label">AcBinary NoRef</div>
|
||
</div>
|
||
<div class="stat-card success">
|
||
<div class="value">11.2 KB</div>
|
||
<div class="label">MessagePack</div>
|
||
</div>
|
||
</div>
|
||
|
||
<h3>M<EFBFBD>ret ar<61>ny (MessagePack = 100%)</h3>
|
||
<div class="comparison-bar">
|
||
<div class="segment acbinary" style="width: 62.5%;">AcBinary: 168%</div>
|
||
<div class="segment msgpack" style="width: 37.5%;">MsgPack: 100%</div>
|
||
</div>
|
||
<div class="legend">
|
||
<div class="legend-item"><div class="legend-color" style="background: var(--primary);"></div> AcBinary</div>
|
||
<div class="legend-item"><div class="legend-color" style="background: #f97316;"></div> MessagePack</div>
|
||
</div>
|
||
|
||
<div class="note">
|
||
?? <strong>Megjegyz<EFBFBD>s:</strong> Az AcBinary nagyobb m<>retet eredm<64>nyez a be<62>p<EFBFBD>tett metaadat (property nevek t<>bl<62>ja) <20>s t<>pusinform<72>ci<63>k miatt, ami viszont lehet<65>v<EFBFBD> teszi a schema evol<6F>ci<63>t <20>s a gyorsabb deszerializ<69>l<EFBFBD>st.
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Teljes<65>tm<74>ny t<>bl<62>zat -->
|
||
<div class="card">
|
||
<h2>? Teljes<65>tm<74>ny <20>sszehasonl<6E>t<EFBFBD>s</h2>
|
||
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>M<EFBFBD>velet</th>
|
||
<th class="number">AcBinary</th>
|
||
<th class="number">MessagePack</th>
|
||
<th class="number">Ar<EFBFBD>ny</th>
|
||
<th>Eredm<EFBFBD>ny</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><strong>Serialize WithRef</strong></td>
|
||
<td class="number">84.20 ?s</td>
|
||
<td class="number">18.84 ?s</td>
|
||
<td class="number">4.47<EFBFBD></td>
|
||
<td><span class="badge badge-warning">MsgPack gyorsabb</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Serialize NoRef</strong></td>
|
||
<td class="number">70.18 ?s</td>
|
||
<td class="number">18.84 ?s</td>
|
||
<td class="number">3.73<EFBFBD></td>
|
||
<td><span class="badge badge-warning">MsgPack gyorsabb</span></td>
|
||
</tr>
|
||
<tr class="winner">
|
||
<td><strong>Deserialize WithRef</strong></td>
|
||
<td class="number">40.10 ?s</td>
|
||
<td class="number">41.10 ?s</td>
|
||
<td class="number">0.98<EFBFBD></td>
|
||
<td><span class="badge badge-success">AcBinary gyorsabb</span></td>
|
||
</tr>
|
||
<tr class="winner">
|
||
<td><strong>Deserialize NoRef</strong></td>
|
||
<td class="number">1.02 ?s</td>
|
||
<td class="number">41.10 ?s</td>
|
||
<td class="number">0.025<EFBFBD></td>
|
||
<td><span class="badge badge-success">40<EFBFBD> gyorsabb!</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Populate</strong></td>
|
||
<td class="number">39.27 ?s</td>
|
||
<td class="number"><EFBFBD></td>
|
||
<td class="number"><EFBFBD></td>
|
||
<td><span class="badge badge-info">Csak AcBinary</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>PopulateMerge</strong></td>
|
||
<td class="number">40.73 ?s</td>
|
||
<td class="number"><EFBFBD></td>
|
||
<td class="number"><EFBFBD></td>
|
||
<td><span class="badge badge-info">Csak AcBinary</span></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<!-- Mem<65>ria haszn<7A>lat -->
|
||
<div class="card">
|
||
<h2>?? Mem<65>ria Allok<6F>ci<63> (GC Diagnosztika)</h2>
|
||
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>M<EFBFBD>velet</th>
|
||
<th class="number">AcBinary</th>
|
||
<th class="number">MessagePack</th>
|
||
<th class="number">Gen0</th>
|
||
<th class="number">Gen1</th>
|
||
<th><EFBFBD>rt<EFBFBD>kel<EFBFBD>s</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><strong>Serialize WithRef</strong></td>
|
||
<td class="number">55.34 KB</td>
|
||
<td class="number">12.50 KB</td>
|
||
<td class="number">9.03</td>
|
||
<td class="number"><EFBFBD></td>
|
||
<td><span class="badge badge-warning">4.43<EFBFBD> t<>bb</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Serialize NoRef</strong></td>
|
||
<td class="number">46.30 KB</td>
|
||
<td class="number">12.50 KB</td>
|
||
<td class="number">7.45</td>
|
||
<td class="number"><EFBFBD></td>
|
||
<td><span class="badge badge-warning">3.70<EFBFBD> t<>bb</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>Deserialize WithRef</strong></td>
|
||
<td class="number">38.17 KB</td>
|
||
<td class="number">26.24 KB</td>
|
||
<td class="number">6.23</td>
|
||
<td class="number">0.43</td>
|
||
<td><span class="badge badge-warning">1.45<EFBFBD> t<>bb</span></td>
|
||
</tr>
|
||
<tr class="winner">
|
||
<td><strong>Deserialize NoRef</strong></td>
|
||
<td class="number">2.85 KB</td>
|
||
<td class="number">26.24 KB</td>
|
||
<td class="number">0.47</td>
|
||
<td class="number">0.004</td>
|
||
<td><span class="badge badge-success">9<EFBFBD> kevesebb!</span></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<div class="note warning-note">
|
||
?? <strong>GC Pressure:</strong> A Serialize WithRef 9.03 Gen0 GC-t triggerel 1000 m<>veletre. Ez jelent<6E>s GC nyom<6F>st jelent nagy <20>tereszt<7A>k<EFBFBD>pess<73>g<EFBFBD> szerver alkalmaz<61>sokban.
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Allok<6F>ci<63>s hotspotok -->
|
||
<div class="card">
|
||
<h2>?? Mem<65>ria Allok<6F>ci<63>s Hotspotok</h2>
|
||
|
||
<h3>Serialize (55.34 KB allok<6F>ci<63>)</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Forr<EFBFBD>s</th>
|
||
<th class="number">Becs<EFBFBD>lt m<>ret</th>
|
||
<th>Le<EFBFBD>r<EFBFBD>s</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><code>ToArray()</code></td>
|
||
<td class="number">~19 KB</td>
|
||
<td>V<EFBFBD>gs<EFBFBD> byte[] allok<6F>ci<63> a visszat<61>r<EFBFBD>si <20>rt<72>khez</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>Dictionary<object,int></code></td>
|
||
<td class="number">~8 KB</td>
|
||
<td>Reference scanning: _scanOccurrences, _writtenRefs</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>HashSet<object></code></td>
|
||
<td class="number">~4 KB</td>
|
||
<td>Multi-referenced objektumok nyilv<6C>ntart<72>sa</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>Dictionary<string,int></code></td>
|
||
<td class="number">~6 KB</td>
|
||
<td>Property name table + string interning</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>List<string></code></td>
|
||
<td class="number">~4 KB</td>
|
||
<td>Property nevek <20>s interned stringek list<73>i</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Boxing</td>
|
||
<td class="number">~10 KB</td>
|
||
<td>Value type boxing a property getter-ekben</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Egy<EFBFBD>b</td>
|
||
<td class="number">~4 KB</td>
|
||
<td>Closure-ok, delegate-ek, <20>tmeneti objektumok</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<!-- Optimaliz<69>l<EFBFBD>si javaslatok -->
|
||
<div class="card">
|
||
<h2>?? Tov<6F>bbi Optimaliz<69>l<EFBFBD>si Lehet<65>s<EFBFBD>gek</h2>
|
||
|
||
<div class="optimization-item high">
|
||
<h4>
|
||
<span class="impact-badge impact-high">MAGAS HAT<41>S</span>
|
||
1. IBufferWriter<byte> alap<61> Serialize
|
||
</h4>
|
||
<p>
|
||
A <code>ToArray()</code> h<>v<EFBFBD>s ~19 KB allok<6F>ci<63>t okoz. Ehelyett <code>IBufferWriter<byte></code>
|
||
interf<72>sz haszn<7A>lat<61>val a h<>v<EFBFBD> biztos<6F>thatja a buffert, elker<65>lve az allok<6F>ci<63>t.
|
||
</p>
|
||
<p><strong>Becs<EFBFBD>lt megtakar<61>t<EFBFBD>s:</strong> ~35% mem<65>ria cs<63>kken<65>s serialize-n<>l</p>
|
||
</div>
|
||
|
||
<div class="optimization-item high">
|
||
<h4>
|
||
<span class="impact-badge impact-high">MAGAS HAT<41>S</span>
|
||
2. Typed Property Getter-ek (Boxing elker<65>l<EFBFBD>se)
|
||
</h4>
|
||
<p>
|
||
A jelenlegi <code>Func<object, object?></code> getter minden value type-ot boxol.
|
||
T<>pusos getter-ek (<code>Func<T, int></code>, stb.) haszn<7A>lat<61>val megsz<73>ntethet<65>.
|
||
</p>
|
||
<p><strong>Becs<EFBFBD>lt megtakar<61>t<EFBFBD>s:</strong> ~10 KB / serialize (~18% cs<63>kken<65>s)</p>
|
||
</div>
|
||
|
||
<div class="optimization-item medium">
|
||
<h4>
|
||
<span class="impact-badge impact-medium">K<EFBFBD>ZEPES HAT<41>S</span>
|
||
3. Reference Tracking gy<67>jtem<65>nyek pooloz<6F>sa
|
||
</h4>
|
||
<p>
|
||
A <code>Dictionary</code> <20>s <code>HashSet</code> objektumok a context pool-ban maradnak,
|
||
de <code>Clear()</code> ut<75>n is megtartj<74>k a kapacit<69>sukat. A poolban t<>rol<6F>s el<65>tt
|
||
<20>rdemes lenne <code>TrimExcess()</code> h<>vni, vagy kisebb initial capacity-t haszn<7A>lni.
|
||
</p>
|
||
<p><strong>Becs<EFBFBD>lt megtakar<61>t<EFBFBD>s:</strong> ~5 KB / serialize</p>
|
||
</div>
|
||
|
||
<div class="optimization-item medium">
|
||
<h4>
|
||
<span class="impact-badge impact-medium">K<EFBFBD>ZEPES HAT<41>S</span>
|
||
4. String.Create() UTF8 k<>dol<6F>shoz
|
||
</h4>
|
||
<p>
|
||
A deszerializ<69>l<EFBFBD>sn<73>l a <code>Encoding.UTF8.GetString()</code> <20>j stringet allok<6F>l.
|
||
<code>String.Create()</code> span callback-kel k<>zvetlen<65>l a string bufferbe <20>rhat.
|
||
</p>
|
||
<p><strong>Becs<EFBFBD>lt megtakar<61>t<EFBFBD>s:</strong> ~2 KB / deserialize komplex objektumokn<6B>l</p>
|
||
</div>
|
||
|
||
<div class="optimization-item low">
|
||
<h4>
|
||
<span class="impact-badge impact-low">ALACSONY HAT<41>S</span>
|
||
5. Two-pass serialize elker<65>l<EFBFBD>se NoRef m<>dban
|
||
</h4>
|
||
<p>
|
||
NoRef m<>dban is fut a <code>CollectPropertyNames</code> f<>zis a metaadathoz.
|
||
Ha a t<>pus ismert <20>s stabil, a property nevek el<65>re cache-elhet<65>k.
|
||
</p>
|
||
<p><strong>Becs<EFBFBD>lt megtakar<61>t<EFBFBD>s:</strong> ~10% sebess<73>g javul<75>s NoRef serialize-n<>l</p>
|
||
</div>
|
||
|
||
<div class="optimization-item low">
|
||
<h4>
|
||
<span class="impact-badge impact-low">ALACSONY HAT<41>S</span>
|
||
6. Span-based enum serialization
|
||
</h4>
|
||
<p>
|
||
A <code>Convert.ToInt32(value)</code> enum <20>rt<72>kekn<6B>l boxing-ot okoz.
|
||
T<>pusos enum kezel<65>s vagy <code>Unsafe.As</code> haszn<7A>lat<61>val elker<65>lhet<65>.
|
||
</p>
|
||
<p><strong>Becs<EFBFBD>lt megtakar<61>t<EFBFBD>s:</strong> ~24 byte / enum <20>rt<72>k</p>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Funkci<63> <20>sszehasonl<6E>t<EFBFBD>s -->
|
||
<div class="card">
|
||
<h2>?? Funkci<63> <20>sszehasonl<6E>t<EFBFBD>s</h2>
|
||
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Funkci<EFBFBD></th>
|
||
<th style="text-align: center;">AcBinary</th>
|
||
<th style="text-align: center;">MessagePack</th>
|
||
<th>Megjegyz<EFBFBD>s</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>Reference Handling ($id/$ref)</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td>K<EFBFBD>z<EFBFBD>s objektumok deduplik<69>l<EFBFBD>sa</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Populate (megl<67>v<EFBFBD> objektum)</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td>L<EFBFBD>tez<EFBFBD> objektum friss<73>t<EFBFBD>se</td>
|
||
</tr>
|
||
<tr>
|
||
<td>PopulateMerge (IId merge)</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td>Lista elemek ID alap<61> merge</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Schema Evolution</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td style="text-align: center;">??</td>
|
||
<td>Property n<>v alap<61> mapping</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Metadata Table</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td>Property nevek indexel<65>se</td>
|
||
</tr>
|
||
<tr>
|
||
<td>String Interning</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td>Ism<EFBFBD>tl<EFBFBD>d<EFBFBD> stringek deduplik<69>l<EFBFBD>sa</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Kompakt m<>ret</td>
|
||
<td style="text-align: center;">??</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td>MsgPack ~40% kisebb</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Serialize sebess<73>g</td>
|
||
<td style="text-align: center;">??</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td>MsgPack 3-4<> gyorsabb</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Deserialize sebess<73>g</td>
|
||
<td style="text-align: center;">?</td>
|
||
<td style="text-align: center;">??</td>
|
||
<td>AcBinary ak<61>r 40<34> gyorsabb</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
<!-- Aj<41>nl<6E>sok -->
|
||
<div class="card">
|
||
<h2>?? Mikor Melyiket Haszn<7A>ld?</h2>
|
||
|
||
<div class="summary-grid">
|
||
<div class="summary-item" style="border-left-color: var(--primary);">
|
||
<h4>?? AcBinary aj<61>nlott</h4>
|
||
<ul>
|
||
<li>Deserialize-heavy workload (kliens oldal)</li>
|
||
<li>Populate/Merge sz<73>ks<6B>ges</li>
|
||
<li>Reference handling kell (shared objects)</li>
|
||
<li>Schema v<>ltoz<6F>sok v<>rhat<61>ak</li>
|
||
<li>NoRef m<>d haszn<7A>lhat<61> (40<34> gyorsabb!)</li>
|
||
</ul>
|
||
</div>
|
||
<div class="summary-item" style="border-left-color: #f97316;">
|
||
<h4>?? MessagePack aj<61>nlott</h4>
|
||
<ul>
|
||
<li>Serialize-heavy workload (szerver oldal)</li>
|
||
<li>M<EFBFBD>ret kritikus (h<>l<EFBFBD>zati <20>tvitel)</li>
|
||
<li>Egyszer<EFBFBD> objektumok (nincs referencia)</li>
|
||
<li>K<EFBFBD>ls<EFBFBD> rendszerekkel kompatibilit<69>s</li>
|
||
<li>Minim<EFBFBD>lis GC pressure kell</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Kiemelt eredm<64>nyek -->
|
||
<div class="card">
|
||
<h2>?? Kiemelt Eredm<64>nyek</h2>
|
||
|
||
<div class="stats-grid">
|
||
<div class="stat-card success">
|
||
<div class="value">40<EFBFBD></div>
|
||
<div class="label">AcBinary NoRef Deserialize gyorsabb</div>
|
||
</div>
|
||
<div class="stat-card success">
|
||
<div class="value">9<EFBFBD></div>
|
||
<div class="label">Kevesebb mem<65>ria (NoRef Deser.)</div>
|
||
</div>
|
||
<div class="stat-card warning">
|
||
<div class="value">3.7<EFBFBD></div>
|
||
<div class="label">MsgPack Serialize gyorsabb</div>
|
||
</div>
|
||
<div class="stat-card warning">
|
||
<div class="value">4.4<EFBFBD></div>
|
||
<div class="label">T<EFBFBD>bb mem<65>ria (Serialize WithRef)</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- <20>sszegz<67>s -->
|
||
<div class="card">
|
||
<h2>?? <20>sszegz<67>s</h2>
|
||
<div class="note">
|
||
<p><strong>AcBinary er<65>ss<73>gei:</strong></p>
|
||
<ul style="margin: 0.5rem 0 0.5rem 1.5rem;">
|
||
<li>Kiemelked<EFBFBD>en gyors deserializ<69>l<EFBFBD>s, k<>l<EFBFBD>n<EFBFBD>sen NoRef m<>dban (40<34> gyorsabb)</li>
|
||
<li>Be<EFBFBD>p<EFBFBD>tett reference handling <20>s populate/merge t<>mogat<61>s</li>
|
||
<li>Schema evolution friendly (property n<>v alap<61>)</li>
|
||
</ul>
|
||
<br>
|
||
<p><strong>Fejlesztend<EFBFBD> ter<65>letek:</strong></p>
|
||
<ul style="margin: 0.5rem 0 0.5rem 1.5rem;">
|
||
<li>Serialize sebess<73>g (3-4<> lassabb MessagePack-n<>l)</li>
|
||
<li>Mem<EFBFBD>ria allok<6F>ci<63> serialize-n<>l (4.4<EFBFBD> t<>bb)</li>
|
||
<li>Output m<>ret (~68% nagyobb)</li>
|
||
</ul>
|
||
<br>
|
||
<p><strong>Javasolt k<>vetkez<65> l<>p<EFBFBD>sek priorit<69>s szerint:</strong></p>
|
||
<ol style="margin: 0.5rem 0 0 1.5rem;">
|
||
<li>IBufferWriter<byte> t<>mogat<61>s hozz<7A>ad<61>sa</li>
|
||
<li>Typed property getter-ek boxing elker<65>l<EFBFBD>s<EFBFBD>re</li>
|
||
<li>Reference tracking collection pooling optimaliz<69>l<EFBFBD>sa</li>
|
||
</ol>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<footer>
|
||
AcBinary Serializer Benchmark Report | AyCode.Core | 2024
|
||
</footer>
|
||
</body>
|
||
</html>
|