feature: improving electron ipc performance
- Dominant language
- TypeScript
- Stars
- 193k
- Forks
- 42.4k
- PR merge metrics
- PR metrics pending
Description
### Current VSCode Electron ipc
Currently VSCode's electron ipc encodes data into a buffer before sending it via electron native ipc
`javascript object -> Buffer encode -> electron native ipc -> Buffer decode -> javascript object`
### Optimizing VSCode electron ipc
I was wondering if skipping the buffer encoding and decoding would also work, and if it would improve performance
`javascript object -> electron native ipc -> javascript object`
### Benchmark results
For checking if this would improve performance, various benchmarks were ran:
| Measure | Buffer baseline | Direct structured clone | Delta |
| --- | ---: | ---: | ---: |
| Startup instructions, median of 15 launches | 33,812,887,690 | 30,252,883,132 | **-10.53%** |
| Startup cycles, median of 15 launches | 32,342,621,041 | 29,007,468,985 | **-10.31%** |
| Fully ready, mean of 997 launches | 3,418.01 ms | 3,373.77 ms | **-1.29%** |
| Fully ready, median of 997 launches | 3,344.20 ms | 3,297.20 ms | **-1.41%** |
| Smoke tests, mean of 7 | 181.108 s | 170.058 s | **-6.10%** |
| Smoke tests, median of 7 | 180.524 s | 170.421 s | **-5.60%** |
Benchmark Details
#### VScode Memory Leak Finder Setup
```sh
git@github.com:SimonSiefke/vscode-memory-leak-finder.git &&
cd vscode-memory-leak-finder &&
npm ci
```
#### Measuring Cpu instructions and cycles on Linux
```sh
node packages/cli/bin/test.js \
--run-skipped-tests-anyway \
--only editor-open-text-file \
--measure cpu-performance-counters-from-start \
--runs 1 \
--startup-runs 15
```
#### Some more general info linux `perf`
Startup cpu instructions and cycles can be measured using the linux `perf` program.
Example Usage:
```
perf stat echo hello
```
```
Performance counter stats for 'echo hello':
0 context-switches # 0.0 cs/sec cs_per_second
0 cpu-migrations # 0.0 migrations/sec migrations_per_second
426 page-faults # 189142.4 faults/sec page_faults_per_second
2.25 msec task-clock # 0.2 CPUs CPUs_utilized
31,793 branch-misses # 4.6 % branch_miss_rate (14.70%)
833,399 branches # 370.0 M/sec branch_frequency (59.01%)
6,948,290 cpu-cycles # 3.1 GHz cycles_frequency
5,145,842 instructions # 0.7 instructions insn_per_cycle (85.30%)
0.003440571 seconds time elapsed
0.000000000 seconds user
0.003430000 seconds sys
```
#### Other benchmarks
For the other benchmarks i asked codex to measure startup performance of each version 997 times as well as smoke test timings 7 times.
#### Raw Benchmark Data (Cpu Instruction counts)
```
0.100236992,200219440,,instructions:u,142169117,100.00,,
0.100236992,203306315,,cycles:u,142192631,100.00,,
0.200655884,180224190,,instructions:u,29525915,100.00,,
0.200655884,57195705,,cycles:u,29523942,100.00,,
0.301016717,444011348,,instructions:u,110646799,100.00,,
0.301016717,268587311,,cycles:u,110695951,100.00,,
0.401369315,447046704,,instructions:u,102337824,100.00,,
0.401369315,263622934,,cycles:u,102332413,100.00,,
0.501767948,179495843,,instructions:u,62110640,100.00,,
0.501767948,157173144,,cycles:u,62081887,100.00,,
0.602244368,171509372,,instructions:u,63697374,100.00,,
0.602244368,162790118,,cycles:u,63660845,100.00,,
0.702630779,175319111,,instructions:u,63082510,100.00,,
0.702630779,160261753,,cycles:u,63082510,100.00,,
0.803069348,8250284,,instructions:u,6946003,100.00,,
0.803069348,10767878,,cycles:u,6946003,100.00,,
0.903454167,141231880,,instructions:u,78764342,100.00,,
0.903454167,107114823,,cycles:u,78790480,100.00,,
1.003896231,275178992,,instructions:u,111297264,100.00,,
1.003896231,222811584,,cycles:u,111324466,100.00,,
1.104274807,421350414,,instructions:u,232386137,100.00,,
1.104274807,367523115,,cycles:u,232612904,100.00,,
1.204823832,512754115,,instructions:u,227563345,100.00,,
1.204823832,438843902,,cycles:u,231048019,100.00,,
1.305198311,426043411,,instructions:u,144415590,100.00,,
1.305198311,303725636,,cycles:u,140685995,100.00,,
1.405592437,233401658,,instructions:u,157622485,100.00,,
1.405592437,289990174,,cycles:u,157650487,100.00,,
1.506002502,236649322,,instructions:u,184062171,100.00,,
1.506002502,293571619,,cycles:u,184414752,100.00,,
1.606585211,189106175,,instructions:u,140412724,100.00,,
1.606585211,176986549,,cycles:u,140172685,100.00,,
1.707079835,199154791,,instructions:u,133918848,100.00,,
1.707079835,173176432,,cycles:u,133824020,100.00,,
1.807478368,298694922,,instructions:u,114781084,100.00,,
1.807478368,196213667,,cycles:u,114813033,100.00,,
1.908070425,443217396,,instructions:u,154798176,100.00,,
1.908070425,387487749,,cycles:u,155023238,100.00,,
2.008591507,449159961,,instructions:u,200147990,100.00,,
2.008591507,479618066,,cycles:u,199981208,100.00,,
2.109024105,436556208,,instructions:u,198309471,100.00,,
2.109024105,443786657,,cycles:u,198251572,100.00,,
2.209442194,408372547,,instructions:u,176706968,100.00,,
2.209442194,414896627,,cycles:u,176863804,100.00,,
2.309843955,692544297,,instructions:u,313355615,100.00,,
2.309843955,719835972,,cycles:u,313177520,100.00,,
2.410200850,668808840,,instructions:u,287458505,100.00,,
2.410200850,694884354,,cycles:u,287769528,100.00,,
2.510641643,1078543675,,instructions:u,509618910,100.00,,
2.510641643,1067364658,,cycles:u,509682669,100.00,,
2.612858551,1350913799,,instructions:u,613419068,100.00,,
2.612858551,1416806354,,cycles:u,613564560,100.00,,
2.713560451,1517981443,,instructions:u,576270998,100.00,,
2.713560451,1346717263,,cycles:u,576764866,100.00,,
2.814154902,1373460520,,instructions:u,626330758,100.00,,
2.814154902,1283100564,,cycles:u,625791768,100.00,,
2.914657490,1327696724,,instructions:u,610454694,100.00,,
2.914657490,1147203164,,cycles:u,610596748,100.00,,
3.015173194,1253172763,,instructions:u,683823762,100.00,,
3.015173194,1380563273,,cycles:u,684275792,100.00,,
3.115852924,1097765333,,instructions:u,554531257,100.00,,
3.115852924,1085928210,,cycles:u,553618675,100.00,,
3.216289568,1408039086,,instructions:u,619268541,100.00,,
3.216289568,1272034466,,cycles:u,619383307,100.00,,
3.316825549,1076364369,,instructions:u,488048720,100.00,,
3.316825549,932148108,,cycles:u,488314346,100.00,,
3.417396345,1045465910,,instructions:u,361579512,100.00,,
3.417396345,814607683,,cycles:u,361154435,100.00,,
3.517827640,830913777,,instructions:u,402048868,100.00,,
3.517827640,747577458,,cycles:u,402180826,100.00,,
3.618271389,854473353,,instructions:u,470000625,100.00,,
3.618271389,895670563,,cycles:u,469836648,100.00,,
3.718870408,818209177,,instructions:u,330529809,100.00,,
3.718870408,593587512,,cycles:u,330911095,100.00,,
3.819323053,1120698782,,instructions:u,390389810,100.00,,
3.819323053,910203743,,cycles:u,389881715,100.00,,
3.919662205,647914736,,instructions:u,299123541,100.00,,
3.919662205,556677303,,cycles:u,299752170,100.00,,
4.020219096,893021020,,instructions:u,362895175,100.00,,
4.020219096,799200956,,cycles:u,362358009,100.00,,
4.120620906,704320002,,instructions:u,372596569,100.00,,
4.120620906,685013581,,cycles:u,372965720,100.00,,
4.221186001,1009418723,,instructions:u,499554709,100.00,,
4.221186001,1111199710,,cycles:u,500530769,100.00,,
4.321938898,368288326,,instructions:u,183801798,100.00,,
4.321938898,392823887,,cycles:u,182320010,100.00,,
4.422417511,786056,,instructions:u,8454855,100.00,,
4.422417511,4171520,,cycles:u,8454855,100.00,,
4.522904250,958539,,instructions:u,3179521,100.00,,
4.522904250,3393987,,cycles:u,3179521,100.00,,
4.623392502,901002,,instructions:u,2459622,100.00,,
4.623392502,4447465,,cycles:u,2459622,100.00,,
4.723900330,8157217,,instructions:u,6386033,100.00,,
4.723900330,12514349,,cycles:u,6386033,100.00,,
4.824355931,130537408,,instructions:u,109096686,100.00,,
4.824355931,148404339,,cycles:u,109159725,100.00,,
4.924857727,120841493,,instructions:u,86680564,100.00,,
4.924857727,126341890,,cycles:u,86779388,100.00,,
5.025313269,939537854,,instructions:u,384722857,100.00,,
5.025313269,752237342,,cycles:u,384704172,100.00,,
5.125710860,610919302,,instructions:u,315069250,100.00,,
5.125710860,576399246,,cycles:u,315078557,100.00,,
5.226090619,466652975,,instructions:u,165607107,100.00,,
5.226090619,405235644,,cycles:u,165507902,100.00,,
5.326455520,378750790,,instructions:u,117160559,100.00,,
5.326455520,269838493,,cycles:u,117166630,100.00,,
5.426928583,575096139,,instructions:u,161066890,100.00,,
5.426928583,372466499,,cycles:u,161148173,100.00,,
5.527324491,397542960,,instructions:u,187299876,100.00,,
5.527324491,420876428,,cycles:u,187327216,100.00,,
5.627726913,859058939,,instructions:u,277488736,100.00,,
5.627726913,721851035,,cycles:u,277644770,100.00,,
5.728186481,886148143,,instructions:u,294684853,100.00,,
5.728186481,708013849,,cycles:u,294409777,100.00,,
5.828544267,701982552,,instructions:u,265752396,100.00,,
5.828544267,631902905,,cycles:u,265756764,100.00,,
5.928838696,954283014,,instructions:u,318212135,100.00,,
5.928838696,838892014,,cycles:u,318296243,100.00,,
6.029222042,1029302958,,instructions:u,412846153,100.00,,
6.029222042,871475471,,cycles:u,413180980,100.00,,
6.129718519,1066367102,,instructions:u,491534947,100.00,,
6.129718519,1075491038,,cycles:u,491663610,100.00,,
6.230268446,389379694,,instructions:u,184851056,100.00,,
6.230268446,436964452,,cycles:u,184422652,100.00,,
6.330735197,619785075,,instructions:u,220797465,100.00,,
6.330735197,546348614,,cycles:u,220734176,100.00,,
6.431445315,329154690,,instructions:u,164196243,100.00,,
6.431445315,353294777,,cycles:u,164087038,100.00,,
```
#### Raw benchmark data (smoke test times)
```json
{
"schemaVersion": 1,
"generatedAt": "2026-08-11T15:56:14.472Z",
"methodology": {
"measuredRunsPerVariant": 7,
"measuredSequence": [
"baseline",
"candidate",
"candidate",
"baseline",
"candidate",
"baseline",
"baseline",
"candidate",
"baseline",
"candidate",
"candidate",
"baseline",
"candidate",
"baseline"
],
"outcomePerRun": {
"passing": 36,
"pending": 12
},
"bootstrapIterations": 200000,
"bootstrapSeed": "0x1667c0de"
},
"runs": [
{
"filename": "03-measured-baseline-1.json",
"sequenceIndex": 3,
"variant": "baseline",
"wallClockMs": 182809.04071500007,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "04-measured-candidate-1.json",
"sequenceIndex": 4,
"variant": "candidate",
"wallClockMs": 170420.670103,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "05-measured-candidate-2.json",
"sequenceIndex": 5,
"variant": "candidate",
"wallClockMs": 171856.61424300005,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "06-measured-baseline-2.json",
"sequenceIndex": 6,
"variant": "baseline",
"wallClockMs": 181988.74739500007,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "07-measured-candidate-3.json",
"sequenceIndex": 7,
"variant": "candidate",
"wallClockMs": 170816.97545999987,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "08-measured-baseline-3.json",
"sequenceIndex": 8,
"variant": "baseline",
"wallClockMs": 182747.76444200007,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "09-measured-baseline-4.json",
"sequenceIndex": 9,
"variant": "baseline",
"wallClockMs": 179114.770426,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "10-measured-candidate-4.json",
"sequenceIndex": 10,
"variant": "candidate",
"wallClockMs": 170519.58072900004,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "11-measured-baseline-5.json",
"sequenceIndex": 11,
"variant": "baseline",
"wallClockMs": 180482.02685499983,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "12-measured-candidate-5.json",
"sequenceIndex": 12,
"variant": "candidate",
"wallClockMs": 169094.1539950003,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "13-measured-candidate-6.json",
"sequenceIndex": 13,
"variant": "candidate",
"wallClockMs": 167770.82520399988,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "14-measured-baseline-6.json",
"sequenceIndex": 14,
"variant": "baseline",
"wallClockMs": 180088.09581099963,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "15-measured-candidate-7.json",
"sequenceIndex": 15,
"variant": "candidate",
"wallClockMs": 169930.47378200013,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
},
{
"filename": "16-measured-baseline-7.json",
"sequenceIndex": 16,
"variant": "baseline",
"wallClockMs": 180524.17352599977,
"exitCode": 0,
"signal": null,
"passing": 36,
"pending": 12
}
],
"baseline": {
"count": 7,
"samplesMs": [
182809.04071500007,
181988.74739500007,
182747.76444200007,
179114.770426,
180482.02685499983,
180088.09581099963,
180524.17352599977
],
"meanMs": 181107.80273857134,
"medianMs": 180524.17352599977,
"sampleStandardDeviationMs": 1420.3254943946436,
"minimumMs": 179114.770426,
"maximumMs": 182809.04071500007,
"rangeMs": 3694.2702890000655
},
"candidate": {
"count": 7,
"samplesMs": [
170420.670103,
171856.61424300005,
170816.97545999987,
170519.58072900004,
169094.1539950003,
167770.82520399988,
169930.47378200013
],
"meanMs": 170058.47050228575,
"medianMs": 170420.670103,
"sampleStandardDeviationMs": 1312.2545721315878,
"minimumMs": 167770.82520399988,
"maximumMs": 171856.61424300005,
"rangeMs": 4085.7890390001703
},
"comparison": {
"meanDifferenceMs": -11049.332236285583,
"medianDifferenceMs": -10103.503422999755,
"meanImprovementPercent": 6.100969736922527,
"medianImprovementPercent": 5.596759273651852,
"meanImprovementBootstrap95PercentCI": [
5.404860373559216,
6.813583155719003
],
"medianImprovementBootstrap95PercentCI": [
5.313241299436936,
7.0853794998723325
],
"exactTwoSidedPermutationPValue": 0.0005827505827505828,
"extremePermutationCount": 2,
"permutationCount": 3432,
"candidateFasterPairCount": 49,
"totalCrossVariantPairs": 49
}
}
```
#### Raw Benchmark data (startup performance)
[startup-997x-20260810-samples.csv](https://github.com/user-attachments/files/30980135/startup-997x-20260810-samples.csv)
### Conclusion
Overall this seems to be a small, but useful performance improvement. With startup performance improving by ca. 1.4% and smoke test performance improving by 5.6%.
Contributor guide
Assessment
This issue has not been assessed yet.