




) and only implement the features that you actually need. And overall you will have very simple specific code that will be easy to maintain and will not have all the Chef complexity in it too.| name | height | weight | smelliness |
|-------+--------+--------+------------|
| alice | 0.6 | 0.4 | 0.8 |
| bob | 0.8 | 0.6 | 0.5 || name | height | weight | speed | accuracy | quick thinking |
|-------+--------+--------+-------+----------+----------------|
| bob | 1.0 | 0.5 | 0.3 | 0.1 | 0.2 |
| roy | 0.8 | 0.9 | 0.1 | 0.7 | 0.4 |
| dylan | 0.8 | 0.4 | 0.9 | 0.9 | 0.8 || name | typesafety | conciseness | syntax sugar | performance | memory usage | metaprogramming capabilities | total language power as sum of all |
|-------+------------+-------------+--------------+-------------+--------------+------------------------------+------------------------------------|
| lua | 0.0 | 0.6 | 0.1 | 0.4 | 0.8 | 0.0 | 1.9 |
| ruby | 0.0 | 0.9 | 0.8 | 0.1 | 0.2 | 0.5 | 2.5 |
| lisp | 0.0 | 0.6 | 0.2 | 0.3 | 0.5 | 0.6 | 2.2 |
| rust | 1.0 | 0.3 | 0.4 | 1.0 | 1.0 | 0.7 | 4.4 |
| ocaml | 1.0 | 0.8 | 0.2 | 0.9 | 0.8 | 0.3 | 4.0 |
| go | 0.6 | 0.2 | 0.0 | 0.8 | 0.8 | 0.0 | 2.4 |
| java | 0.5 | 0.2 | 0.2 | 0.7 | 0.0 | 0.0 | 1.6 || attribute name | importance |
|------------------------------+------------|
| typesafety | 1.0 |
| conciseness | 0.6 |
| syntax sugar | 0.0 |
| performance | 0.5 |
| memory usage | 0.7 |
| metaprogramming capabilities | 0.0 || name | typesafety | conciseness | syntax sugar | performance | memory usage | metaprogramming capabilities | total language power as sum of all |
|-------+------------+-------------+--------------+-------------+--------------+------------------------------+------------------------------------|
| lua | 0.0 * 1.0 | 0.6 * 0.6 | 0.1 * 0.0 | 0.4 * 0.5 | 0.8 * 0.7 | 0.0 * 0.0 | 1.12 |
| ruby | 0.0 * 1.0 | 0.9 * 0.6 | 0.8 * 0.0 | 0.1 * 0.5 | 0.2 * 0.7 | 0.5 * 0.0 | 0.73 |
| lisp | 0.0 * 1.0 | 0.6 * 0.6 | 0.2 * 0.0 | 0.3 * 0.5 | 0.5 * 0.7 | 0.6 * 0.0 | 0.86 |
| rust | 1.0 * 1.0 | 0.3 * 0.6 | 0.4 * 0.0 | 1.0 * 0.5 | 1.0 * 0.7 | 0.7 * 0.0 | 2.38 |
| ocaml | 1.0 * 1.0 | 0.8 * 0.6 | 0.2 * 0.0 | 0.9 * 0.5 | 0.8 * 0.7 | 0.3 * 0.0 | 2.49 |
| go | 0.6 * 1.0 | 0.2 * 0.6 | 0.0 * 0.0 | 0.8 * 0.5 | 0.8 * 0.7 | 0.0 * 0.0 | 1.68 |
| java | 0.5 * 1.0 | 0.2 * 0.6 | 0.2 * 0.0 | 0.7 * 0.5 | 0.0 * 0.7 | 0.0 * 0.0 | 0.97 |

QuoteFor a wide range of applications, neither ClickHouse nor Druid or Pinot are obvious winners. First and foremost, I recommend to take into account, the source code of which system your are able to understand, fix bugs, add features, etc. The section "On Performance Comparisons and Choice of the System" discusses this more.
interface PriceApi {
double getPrice();
}
class ExchangeA implements PriceApi {
double getPrice() {
...
return thePrice;
}
}
...
double queryPrice(PriceApi api) {
return api.getPrice();
}
interface PriceApi {
void initSession();
double getPrice();
}
class ExchangeA implements PriceApi {
void initSession() {}
double getPrice() {
...
return thePrice;
}
}
class ExchangeB implements PriceApi {
void initSession() {
// do some magicka to initiate the session
...
}
double getPrice() {
...
return thePrice;
}
}
...
double queryPrice(PriceApi api) {
api.initSession();
return api.getPrice();
}
type exchange =
| ExchangeA
| ExchangeB
let query_price =
function
| ExchangeA -> (
exchange_a_get_price ()
)
| ExchangeB -> (
exchange_b_init_session ();
exchange_b_get_price ()
)

