I think the problem can be separated into two:
1. Guarantee a given Big O complexity of a function, (that's what matters for most cases), 2. Guarantee / tell the worst case execution time / CPU cycles of a given @constanttime function. Combining these two, we can calculate the worst case execition time for the full program.

@constanttime can have branches, each branch with different worst case execution time, it won't change the @constanttime nature of the funcion. (But makes it harder to calculate the worst case execution time, and the average case and the worst case won't be the same.)

@constanttime could also have loops / recursion, if the number of iterations / recursion is limited. I.e. sorting 5 numbers during the median of 5 algorithm is @constanttime, even if it calls a sort function which is O(N log N). I.e. this is valid:

@constanttime auto sort5(Range)(Range values)
{
  assert(values.length <= 5);
  return values.bubblesort();
}

/* inferred: @quadratic */ int[] bubblesort(int[] values) {
  for (int i=0; i<values.length; i++)
    for (int j=i+1; j<values.length; j++)
      if (values[j] < values[i])
        swap(values[i], values[j]);
}

If the number of iteration in a function is proportional to the input's length, then it's @linear or @BigO_N. If there are two such iterations nested, then it's @quadratic or @BigO_N2, and so on. These could be very well inferred and guaranteed by the compiler. But the Compiler might not realize that the amortized time is less than what it looks like from the first glance. So the user could annotate a function inferred as @quadratic as @linear. Then the linearity of the function could be validated / guaranteed during runtime using the amortization credit system: the function should allocate credits based on the input size and its promise, then use this credit to call @constattime functions, while not running out of credits. These credits could be passed-on to @linear functions as well, those will use more credits, according their input sizes. If the promise is broken and the program runs out of credit, it should break immediately. This validation could be turned off, similar to assert calls.

Reply via email to