Optional Outputs¶
tulip_rs computes the primary indicator and all intermediate outputs in a single pass through the data. C Tulip and TA-Lib require separate function calls for each intermediate result.
The Equiv. Total column sums the competitor's time for the primary indicator plus each sub-indicator called separately. The Rust time already includes every optional output.
| Indicator | Optional outputs | Rust all-outputs (ns) | C Equiv. Total (ns) | C / Rust |
|---|---|---|---|---|
| adosc | short_ema, long_ema, ad | 7,843 | 35,053 | 4.47× |
| adx | dx, atr, tr | 10,474 | 32,055 | 3.06× |
| adxr | adx, dx, atr, tr | 17,064 | 54,662 | 3.20× |
| ao | short_sma, long_sma, medprice | 10,006 | 18,285 | 1.83× |
| apo | short_ema, long_ema | 7,204 | 29,575 | 4.11× |
| aroonosc | aroon_down, aroon_up | 21,484 | 72,709 | 3.38× |
| atr | tr | 4,599 | 12,439 | 2.70× |
| cci | sma, md, typprice | 55,995 | 91,255 | 1.63× |
| dema | ema | 6,393 | 16,827 | 2.63× |
| di | atr, tr | 10,978 | 22,506 | 2.05× |
| dpo | sma | 3,457 | 5,224 | 1.51× |
| dx | atr, tr | 9,293 | 18,806 | 2.02× |
| elderray | ema | 7,409 | 25,189 | 3.40× |
| emv | medprice | 3,521 | 6,436 | 1.83× |
| fosc | tsf, linreg, linregslope, linregintercept | 9,726 | 25,616 | 2.63× |
| kvo | short_ema, long_ema | 8,902 | 32,275 | 3.63× |
| linreg | linregslope, linregintercept | 6,239 | 16,438 | 2.63× |
| macd | short_ema, long_ema | 11,169 | 31,709 | 2.84× |
| md | sma | 12,339 | 16,864 | 1.37× |
| mfi | typprice | 8,629 | 18,954 | 2.20× |
| natr | atr, tr | 5,476 | 22,950 | 4.19× |
| ppo | short_ema, long_ema | 4,878 | 30,177 | 6.19× |
| roc | mom | 2,861 | 3,970 | 1.39× |
| stddev | sma | 3,908 | 12,955 | 3.31× |
| stochrsi | rsi | 19,190 | 52,502 | 2.74× |
| tema | dema, ema | 7,751 | 23,602 | 3.05× |
| trix | tema, dema, ema | 8,799 | 34,121 | 3.88× |
| tsf | tsf, linreg, linregslope, linregintercept | 7,810 | 24,663 | 3.16× |
| vidya | short_sma, long_sma, short_stddev, long_stddev | 12,016 | 44,226 | 3.68× |
| vosc | short_sma, long_sma | 7,466 | 9,994 | 1.34× |
| wma | sma | 5,492 | 10,871 | 1.98× |
Indicators with no C Tulip equivalent (chandelierexit, keltnerchannel, trvi, vortex) are not shown.
Only indicators where TA-Lib implements at least one equivalent sub-indicator are shown.
| Indicator | Optional outputs | Rust all-outputs (ns) | TA-Lib Equiv. Total (ns) | TA-Lib / Rust |
|---|---|---|---|---|
| adosc | short_ema, long_ema, ad | 7,843 | 34,504 | 4.40× |
| adx | dx, atr, tr | 10,474 | 67,869 | 6.48× |
| adxr | adx, dx, atr, tr | 17,064 | 105,705 | 6.19× |
| apo | short_ema, long_ema | 7,204 | 32,007 | 4.44× |
| aroonosc | aroon_down, aroon_up | 21,484 | 140,135 | 6.52× |
| atr | tr | 4,599 | 31,134 | 6.77× |
| cci | sma, md, typprice | 55,995 | 123,342 | 2.20× |
| dema | ema | 6,393 | 32,741 | 5.12× |
| di | atr, tr | 10,978 | 85,756 | 7.81× |
| macd | short_ema, long_ema | 11,169 | 56,816 | 5.09× |
| mfi | typprice | 8,629 | 37,618 | 4.36× |
| natr | atr, tr | 5,476 | 58,470 | 10.68× |
| ppo | short_ema, long_ema | 4,878 | 34,915 | 7.16× |
| roc | mom | 2,861 | 6,609 | 2.31× |
| tema | dema, ema | 7,751 | 64,748 | 8.35× |
| wma | sma | 5,492 | 9,602 | 1.75× |
C Tulip calculation details
C Tulip times taken from the Standard benchmark (single call per sub-indicator):
| # | Indicator | Calculation |
|---|---|---|
| adosc C | C | adosc(9076) + ema(10501) + ema(10501) + ad(4975) = 35,053 |
| adosc TA | TA-Lib | adosc(8556) + ema(10477) + ema(10477) + ad(4994) = 34,504 |
| adx C | C | adx(13249) + dx(6367) + atr(10439) + tr(2000) = 32,055 |
| adx TA | TA-Lib | adx(36735) + atr(27396) + tr(3738) = 67,869 |
| adxr C | C | adxr(22607) + adx(13249) + dx(6367) + atr(10439) + tr(2000) = 54,662 |
| adxr TA | TA-Lib | adxr(37836) + adx(36735) + atr(27396) + tr(3738) = 105,705 |
| ao C | C | ao(11548) + sma(2572) + sma(2572) + medprice(1593) = 18,285 |
| apo C | C | apo(8573) + ema(10501) + ema(10501) = 29,575 |
| apo TA | TA-Lib | apo(11053) + ema(10477) + ema(10477) = 32,007 |
| aroonosc C | C | aroonosc(35588) + aroon(37121) = 72,709 (aroon returns both up and down in one call) |
| aroonosc TA | TA-Lib | aroonosc(68045) + aroon(72090) = 140,135 (aroon returns both up and down in one call) |
| atr C | C | atr(10439) + tr(2000) = 12,439 |
| atr TA | TA-Lib | atr(27396) + tr(3738) = 31,134 |
| cci C | C | cci(72586) + sma(2572) + md(14292) + typprice(1805) = 91,255 (md and typprice not available separately in TA-Lib) |
| cci TA | TA-Lib | cci(118567) + sma(4775) = 123,342 (md and typprice not available separately in TA-Lib) |
| dema C | C | dema(6326) + ema(10501) = 16,827 |
| dema TA | TA-Lib | dema(22264) + ema(10477) = 32,741 |
| di C | C | di(10067) + atr(10439) + tr(2000) = 22,506 |
| di TA | TA-Lib | di(54622) + atr(27396) + tr(3738) = 85,756 |
| dpo C | C | dpo(2652) + sma(2572) = 5,224 |
| dx C | C | dx(6367) + atr(10439) + tr(2000) = 18,806 |
| elderray C | C | elderray(14688) + ema(10501) = 25,189 |
| emv C | C | emv(4843) + medprice(1593) = 6,436 |
| fosc C | C | fosc(9175) + tsf(8222) + linreg(8219) = 25,616 (slope/intercept have no standalone C equivalent) |
| kvo C | C | kvo(11273) + ema(10501) + ema(10501) = 32,275 |
| linreg C | C | linreg(8219) + linreg(8219) = 16,438 (slope and intercept not available as standalone in C Tulip) |
| macd C | C | macd(10707) + ema(10501) + ema(10501) = 31,709 |
| macd TA | TA-Lib | macd(35862) + ema(10477) + ema(10477) = 56,816 |
| md C | C | md(14292) + sma(2572) = 16,864 |
| mfi C | C | mfi(17149) + typprice(1805) = 18,954 (typprice not available separately in TA-Lib) |
| mfi TA | TA-Lib | mfi(18809) + mfi(18809) = 37,618 (typprice not available separately in TA-Lib) |
| natr C | C | natr(10511) + atr(10439) + tr(2000) = 22,950 |
| natr TA | TA-Lib | natr(27336) + atr(27396) + tr(3738) = 58,470 |
| ppo C | C | ppo(9175) + ema(10501) + ema(10501) = 30,177 |
| ppo TA | TA-Lib | ppo(13961) + ema(10477) + ema(10477) = 34,915 |
| roc C | C | roc(2596) + mom(1374) = 3,970 |
| roc TA | TA-Lib | roc(4796) + mom(1813) = 6,609 |
| stddev C | C | stddev(10383) + sma(2572) = 12,955 |
| stochrsi C | C | stochrsi(43358) + rsi(9144) = 52,502 |
| tema C | C | tema(6775) + dema(6326) + ema(10501) = 23,602 |
| tema TA | TA-Lib | tema(32007) + dema(22264) + ema(10477) = 64,748 |
| trix C | C | trix(10519) + tema(6775) + dema(6326) + ema(10501) = 34,121 |
| tsf C | C | tsf(8222) + tsf(8222) + linreg(8219) = 24,663 (slope/intercept have no standalone C equivalent) |
| vidya C | C | vidya(18316) + sma(2572) + sma(2572) + stddev(10383) + stddev(10383) = 44,226 |
| vosc C | C | vosc(4850) + sma(2572) + sma(2572) = 9,994 |
| wma C | C | wma(8299) + sma(2572) = 10,871 |
| wma TA | TA-Lib | wma(4827) + sma(4775) = 9,602 |
Ranked by Advantage¶
| Rank | vs | Indicator | Ratio | Key sub-indicators |
|---|---|---|---|---|
| 1 | TA-Lib | natr |
10.68× | atr, tr |
| 2 | TA-Lib | tema |
8.35× | dema, ema |
| 3 | TA-Lib | di |
7.81× | atr, tr |
| 4 | TA-Lib | ppo |
7.16× | ema, ema |
| 5 | TA-Lib | atr |
6.77× | tr |
| 6 | TA-Lib | aroonosc |
6.52× | aroon |
| 7 | TA-Lib | adx |
6.48× | atr, tr |
| 8 | TA-Lib | adxr |
6.19× | adx, atr, tr |
| 9 | C Tulip | ppo |
6.19× | ema, ema |
| 10 | TA-Lib | dema |
5.12× | ema |