FastRSS
Parse RSS feeds very quickly
Speed
Currently this is already much faster than most of the pure elixir/erlang packages out there. In benchmarks there are speed improvements anywhere between 5.94x - 49.03x over the next fastest package ([feeder_ex])(https://github.com/manukall/feeder_ex) that was tested.
Compared to the slowest elixir options tested (feed_raptor, elixir_feed_parser), FastRSS was sometimes 255.53x faster and used 5,412,308.17x less memory (0.00156 MB vs 8423.70 MB).
Installation
This package is available on hex.
It can be installed by adding fast_rss to your list of dependencies in mix.exs:
def deps do
[
{:fast_rss, "~> 0.2.0"}
]
endYou also need the rust compiler installed: https://www.rust-lang.org/tools/install
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shUsage
There is only one function it takes an RSS string and outputs an {:ok, map()} with string keys.
iex(1)> {:ok, map_of_rss} = FastRSS.parse("...rss_feed_string...")
iex(2)> Map.keys(map_of_rss)
["categories", "cloud", "copyright", "description", "docs", "dublin_core_ext",
"extensions", "generator", "image", "items", "itunes_ext", "language",
"last_build_date", "link", "managing_editor", "namespaces", "pub_date",
"rating", "skip_days", "skip_hours", "syndication_ext", "text_input", "title",
"ttl", "webmaster"]The docs can be found at https://hexdocs.pm/fast_rss.
Benchmark
Benchmark run from 2020-02-22 05:23:47.524699Z UTC
System
Benchmark suite executing on the following system:
| Operating System | macOS |
|---|---|
| CPU Information | Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz |
| Number of Available Cores | 16 |
| Available Memory | 32 GB |
| Elixir Version | 1.10.1 |
| Erlang Version | 22.2.6 |
Configuration
Benchmark suite executing with the following configuration:
| :time | 30 s |
|---|---|
| :parallel | 1 |
| :warmup | 5 s |
Statistics
Input: anxiety
Run Time
| Name | IPS | Average | Devitation | Median | 99th % |
|---|---|---|---|---|---|
| fast_rss | 187.87 | 5.32 ms | ±7.77% | 5.50 ms | 6.07 ms |
| feeder_ex | 3.83 | 260.98 ms | ±4.31% | 257.94 ms | 292.82 ms |
| feed_raptor | 3.01 | 331.82 ms | ±1.68% | 329.61 ms | 354.81 ms |
| elixir_feed_parser | 1.95 | 512.96 ms | ±2.63% | 511.14 ms | 560.28 ms |
Comparison
| Name | IPS | Slower |
|---|---|---|
| fast_rss | 187.87 | |
| feeder_ex | 3.83 | 49.03x |
| feed_raptor | 3.01 | 62.34x |
| elixir_feed_parser | 1.95 | 96.37x |
Memory Usage
| Name | Memory | Factor |
|---|---|---|
| fast_rss | 0.00153 MB | |
| feeder_ex | 17.21 MB | 11223.73x |
| feed_raptor | 268.63 MB | 175173.81x |
| elixir_feed_parser | 313.30 MB | 204302.48x |
Input: ben
Run Time
| Name | IPS | Average | Devitation | Median | 99th % |
|---|---|---|---|---|---|
| fast_rss | 83.88 | 11.92 ms | ±9.92% | 12.32 ms | 14.95 ms |
| feeder_ex | 13.33 | 75.04 ms | ±3.23% | 74.61 ms | 80.51 ms |
| elixir_feed_parser | 3.58 | 279.04 ms | ±2.68% | 279.29 ms | 301.63 ms |
| feed_raptor | 0.48 | 2073.09 ms | ±0.63% | 2071.30 ms | 2099.29 ms |
Comparison
| Name | IPS | Slower |
|---|---|---|
| fast_rss | 83.88 | |
| feeder_ex | 13.33 | 6.29x |
| elixir_feed_parser | 3.58 | 23.41x |
| feed_raptor | 0.48 | 173.9x |
Memory Usage
| Name | Memory | Factor |
|---|---|---|
| fast_rss | 0.00153 MB | |
| feeder_ex | 27.86 MB | 18169.98x |
| elixir_feed_parser | 163.88 MB | 106864.74x |
| feed_raptor | 1577.38 MB | 1028611.82x |
Input: daily
Run Time
| Name | IPS | Average | Devitation | Median | 99th % |
|---|---|---|---|---|---|
| fast_rss | 32.52 | 0.0308 s | ±8.07% | 0.0317 s | 0.0349 s |
| feeder_ex | 5.03 | 0.199 s | ±1.38% | 0.198 s | 0.22 s |
| elixir_feed_parser | 0.64 | 1.57 s | ±1.03% | 1.57 s | 1.60 s |
| feed_raptor | 0.127 | 7.86 s | ±0.28% | 7.85 s | 7.89 s |
Comparison
| Name | IPS | Slower |
|---|---|---|
| fast_rss | 32.52 | |
| feeder_ex | 5.03 | 6.47x |
| elixir_feed_parser | 0.64 | 51.0x |
| feed_raptor | 0.127 | 255.53x |
Memory Usage
| Name | Memory | Factor |
|---|---|---|
| fast_rss | 0.00154 MB | |
| feeder_ex | 109.73 MB | 71201.54x |
| elixir_feed_parser | 880.51 MB | 571336.48x |
| feed_raptor | 6386.15 MB | 4143790.06x |
Input: dave
Run Time
| Name | IPS | Average | Devitation | Median | 99th % |
|---|---|---|---|---|---|
| fast_rss | 399.65 | 2.50 ms | ±11.60% | 2.48 ms | 3.39 ms |
| feeder_ex | 57.18 | 17.49 ms | ±2.15% | 17.44 ms | 18.48 ms |
| elixir_feed_parser | 9.06 | 110.43 ms | ±4.61% | 109.65 ms | 134.74 ms |
| feed_raptor | 1.57 | 636.73 ms | ±1.49% | 637.79 ms | 664.67 ms |
Comparison
| Name | IPS | Slower |
|---|---|---|
| fast_rss | 399.65 | |
| feeder_ex | 57.18 | 6.99x |
| elixir_feed_parser | 9.06 | 44.13x |
| feed_raptor | 1.57 | 254.47x |
Memory Usage
| Name | Memory | Factor |
|---|---|---|
| fast_rss | 0.00155 MB | |
| feeder_ex | 9.25 MB | 5973.16x |
| elixir_feed_parser | 80.42 MB | 51926.44x |
| feed_raptor | 571.15 MB | 368775.6x |
Input: sleepy
Run Time
| Name | IPS | Average | Devitation | Median | 99th % |
|---|---|---|---|---|---|
| fast_rss | 740.80 | 1.35 ms | ±17.51% | 1.27 ms | 2.19 ms |
| feeder_ex | 124.75 | 8.02 ms | ±4.67% | 8.05 ms | 8.68 ms |
| elixir_feed_parser | 26.83 | 37.27 ms | ±5.23% | 36.94 ms | 44.24 ms |
| feed_raptor | 3.12 | 320.34 ms | ±5.17% | 313.72 ms | 368.94 ms |
Comparison
| Name | IPS | Slower |
|---|---|---|
| fast_rss | 740.80 | |
| feeder_ex | 124.75 | 5.94x |
| elixir_feed_parser | 26.83 | 27.61x |
| feed_raptor | 3.12 | 237.31x |
Memory Usage
| Name | Memory | Factor |
|---|---|---|
| fast_rss | 0.00154 MB | |
| feeder_ex | 4.28 MB | 2780.17x |
| elixir_feed_parser | 35.88 MB | 23282.0x |
| feed_raptor | 274.98 MB | 178428.65x |
Input: stuff
Run Time
| Name | IPS | Average | Devitation | Median | 99th % |
|---|---|---|---|---|---|
| fast_rss | 18.95 | 0.0528 s | ±9.87% | 0.0550 s | 0.0644 s |
| feeder_ex | 0.97 | 1.04 s | ±1.40% | 1.04 s | 1.07 s |
| elixir_feed_parser | 0.53 | 1.88 s | ±1.49% | 1.88 s | 1.91 s |
| feed_raptor | 0.0812 | 12.32 s | ±0.15% | 12.32 s | 12.33 s |
Comparison
| Name | IPS | Slower |
|---|---|---|
| fast_rss | 18.95 | |
| feeder_ex | 0.97 | 19.63x |
| elixir_feed_parser | 0.53 | 35.54x |
| feed_raptor | 0.0812 | 233.47x |
Memory Usage
| Name | Memory | Factor |
|---|---|---|
| fast_rss | 0.00156 MB | |
| feeder_ex | 140.58 MB | 90326.23x |
| elixir_feed_parser | 1018.78 MB | 654577.31x |
| feed_raptor | 8423.70 MB | 5412308.17x |