LINUX.ORG.RU

Помогите с числодробилкой

 


0

3

Всем привет. Есть код, который, который делает вот так:

for (unsigned int k = 0; k < 50000; ++k) {

            float curSample = (float)samples.get()[k];
            complexSamples.get()[2 * k] = mycos((float)k*K)*curSample;
            complexSamples.get()[2 * k + 1] = mysin((float)k*K)*curSample;
        }

И это выполняется ну ооочень долго.

Если делать так:

inline float mysin(const float& x) {
    float x3 = x*x*x;
    return x - x3/6 + x3*x*x/120 - x3*x3*x/5040;
}

inline float mycos(const float& x) {
    float _sin = mysin(x);
    return sqrt(1-_sin*_sin);
}

, то время более-менее сокращается, но опять же не устраивает.

Табличный метод почему-то работает медленнее серии Тейлора.

Хочется, чтобы этот код мог вызываться по 500 раз в секунду и успевать работать долгое время на Intel Xeon 1220l v3.

★★
Ответ на: комментарий от Dikar

http://habrahabr.ru/post/111021/

а от себя - все что возможно высчитать заранее времени выполнения, должно быть высчитано. если первое правило не помогло - меняй алгоритм.ну и на всякий случай - не оптимизируй преждевременно.

anonymous
()
Ответ на: комментарий от ebantrop

Тред не читай, сам себе отвечай. Тут лукап быстрее, хотя и сумма работает.

ebantrop
()

И это выполняется ну ооочень долго.

Больше играйся со всякими бесполезными крестами, зачем писать на си с классами, чтоб больше запутать себя, ибо так типа модно?

Табличный метод почему-то работает медленнее серии Тейлора.

Не табличный метод, а его реализация.

то время более-менее сокращается, но опять же не устраивает.

А синуса/косинуса в 1еле-еле знак тебе хватает - у тебя какие диапазоны иксов, что это даже 1знак даёт?

Я тут левой ногой накалякал портянку:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/mman.h>
#include <unistd.h>
#include <pthread.h>
#include <math.h>
#include <x86intrin.h>

double omp_get_wtime(void) {
  struct timespec ts;
  if(clock_gettime(CLOCK_MONOTONIC, &ts) < 0)
    clock_gettime(CLOCK_REALTIME, &ts);
  return ts.tv_sec + ts.tv_nsec / 1e9;
}

enum {KB = 1024ul, MB = KB * 1024, GB = MB * 1024, TB = GB * 1024ul};

#define Mbench_cps(name, calls, call) ({\
    uint64_t __i = calls;\
    double start = omp_get_wtime();\
    do {\
      call;--__i;\
    } while(__i);\
    double time = omp_get_wtime() - start;\
    fprintf(stderr, "%s: %fs, %fcps\n", name, time, calls / time);\
  })
#define Mbench_tpt(name, calls, data_len, call) ({\
    uint64_t i = calls;\
    double start = omp_get_wtime();\
    do {\
      call;\
    } while(--i);\
    double time = omp_get_wtime() - start;\
    fprintf(stderr, "%s: (%lu)%luKB: total %lfGB: %fGB/s\n", name, calls, data_len/KB, ((double)data_len * calls)/GB, ((double)((uint64_t)data_len * calls)/time)/GB);\
  })



float mysin(const float x) {
    float x3 = x*x*x;
    return x - x3/6 + x3*x*x/120 - x3*x3*x/5040;
}

float mycos(const float x) {
    float _sin = mysin(x);
    return sqrt(1-_sin*_sin);
}

void govno_f(float * samples, float * cmplx) {
  float K = 1./123.;
  for (unsigned int k = 0; k < 50000; ++k) {
    float curSample = samples[k];
    cmplx[2 * k + 0] = mycos((float)k*K)*curSample;//tbl ver: (load(coef) + load(sample)) + mull
    //E3-1220L v3 - haswell 256k 4m
    //load | load | store | fma | fma
    //coef | smpl | cmplx |-3*-2|  - //1tick
    //coef | smpl | cmplx |-3*-2|  - //1tick
    //tpt ~= cmplx per 2 tick
    
    //coef_tbl = 50000 * sizeof(float) * 2 = 0.38m
    //samples = 50000 * sizeof(float) = 0.19
    //cmplx = coef = 0.38m
    //total 0.95(0.57 nontbl)m
    //tpt == tpt llc ~= 8(10?)byte/c
    //tpt ~= cmplx per 2.5tick
    //tpt ~= max(2.5, 2) == 2.5tick per k
    cmplx[2 * k + 1] = mysin((float)k*K)*curSample;
  }
}

void * mmap_alloc(uint64_t len, int prot, int flags) {
  return mmap(NULL, len, prot, MAP_PRIVATE | MAP_ANONYMOUS | flags, 0, 0);
}

void * rwp_alloc(uint64_t len) {
  return mmap_alloc(len * sizeof(float), PROT_READ | PROT_WRITE, MAP_POPULATE);
}

typedef float __attribute__((vector_size(32))) float_vec_t;

typedef struct {
  float_vec_t * a,* b;
} v2f_t;

v2f_t v2f_alloc(uint64_t len) {
  return (v2f_t){rwp_alloc(len * sizeof(float)), rwp_alloc(len * sizeof(float))};
}

v2f_t gen_table(uint64_t len) {
  v2f_t v = v2f_alloc(len);
  float K = 1./123.;
  uint64_t i = 0;
  do {
    ((float *)(v.a))[i] = mycos((float)i*K);
    ((float *)(v.b))[i] = mysin((float)i*K);
  } while(++i != len);
  return v;
}

/*__attribute__((noinline))*/ void true_f(v2f_t coef, v2f_t r, float_vec_t * samples) {
  float_vec_t * samples_end = samples + 50000 / 8;
  do {
    {
      *r.a++ = *coef.a++ * *samples;
      *r.b++ = *coef.b++ * *samples++;
    }//8samples
    {
      *r.a++ = *coef.a++ * *samples;
      *r.b++ = *coef.b++ * *samples++;
    }//8samples
  } while(samples < samples_end);
}

void llc5way_benchmark(__m256 * store0, __m256 * store1, __m256 * load0,  __m256 * load1,  __m256 * load2, uint64_t data_len) {
  do {
    *store0 = *load0 * *load1; *store1 = *load0 * *load2;++store0, ++store1, ++load0, ++load1, ++load2;
    *store0 = *load0 * *load1; *store1 = *load0 * *load2;++store0, ++store1, ++load0, ++load1, ++load2;
    *store0 = *load0 * *load1; *store1 = *load0 * *load2;++store0, ++store1, ++load0, ++load1, ++load2;
    *store0 = *load0 * *load1; *store1 = *load0 * *load2;++store0, ++store1, ++load0, ++load1, ++load2;
    *store0 = *load0 * *load1; *store1 = *load0 * *load2;++store0, ++store1, ++load0, ++load1, ++load2;
    *store0 = *load0 * *load1; *store1 = *load0 * *load2;++store0, ++store1, ++load0, ++load1, ++load2;
    *store0 = *load0 * *load1; *store1 = *load0 * *load2;++store0, ++store1, ++load0, ++load1, ++load2;
    *store0 = *load0 * *load1; *store1 = *load0 * *load2;++store0, ++store1, ++load0, ++load1, ++load2;
  } while(data_len -= (32 * 8));
}

void l3b(void) {
  uint64_t len = KB / 4, llc_size = sysconf(_SC_LEVEL3_CACHE_SIZE);
  uint64_t alen = MB * 256ul;
  __m256 * store0 = rwp_alloc(alen), * store1 = rwp_alloc(alen), * load0 = rwp_alloc(alen), * load1 = rwp_alloc(alen), * load2 = rwp_alloc(alen);
  do {
    Mbench_tpt("llc5way_benchmark", GB / len * 1, len * 5, ({
      llc5way_benchmark(store0, store1, load0, load1, load2, len);
    }));
  } while((len *= 2) < (llc_size / 5));
  fprintf(stderr, "%lf\n", (llc_size / 5.));
  munmap(store0, alen) | munmap(store1, alen) | munmap(load0, alen) | munmap(load1, alen) | munmap(load2, alen);
}


uint64_t diff(float * a, v2f_t b, uint64_t len) {
  uint64_t i = 0, ret = 0;
  do {
    float diff_i = fmaxf(a[i * 2 + 0], ((float *)(b.a))[i]) - fminf(a[i * 2 + 0], ((float *)(b.a))[i]);
    float diff_r = fmaxf(a[i * 2 + 1], ((float *)(b.b))[i]) - fminf(a[i * 2 + 1], ((float *)(b.b))[i]);
    float eps = 1e-7f;
    if((fabsf(diff_i) > eps) | (fabsf(diff_r) > eps)) ret = 1;
  } while(++i != len);
  return ret;
}

void gen_rdat(float * samples, uint64_t len) {
  srand48(123);
  
  uint64_t i = 0;
  do {
    samples[i] = drand48();
  } while(++i != len);
  
}
int main(void) {
  uint64_t len = 50000;
  v2f_t r = v2f_alloc(len), coef = gen_table(len);
  float * samples = rwp_alloc(len * sizeof(float));
  float * r_govno = rwp_alloc(len * sizeof(float) * 2);
  
  gen_rdat(samples, len);
  
  Mbench_cps("govno_f", GB / len / 10, ({
    govno_f(samples, r_govno);
  }));
  Mbench_cps("true_f", GB / len, ({
    true_f(coef, r, samples);
  }));
  
  Mbench_tpt("govno_f", GB / len / 10, len * sizeof(float) * 2, ({
    govno_f(samples, r_govno);
  }));
   Mbench_tpt("true_f", GB / len, len * sizeof(float) * 2, ({
    true_f(coef, r, samples);
  }));
  
  fprintf(stderr, "%lu\n", diff(r_govno, r, len));
  
  l3b();
}

Собирать gcc main.c -lm -std=gnu11 -O3 -march=native

Скопипасти оттуда и выкати пж мне выхлоп с твоего хеона - мне интересно. Судя по расчётам это должно выдавать в районе 10к.

Сейчас тут в районе 2-2.5 тактов на шаг твоего цикла, а это 40умножений, -4умножения в самом цикле, - на синусы остаётся 36. Твои текущие синусы - это по 3fma, считай по 3умножения. Т.е. если выпилить таблицу, то раза в 2-3 можно попытаться сделать.

TrueTsar1C
()
Ответ на: комментарий от Dark_SavanT

Ога, снова эти эксперты в треде. Эксперта который писал математику прям видно за версту и его авторитетное мнение сияет в ночи.

TrueTsar1C
()
Ответ на: комментарий от anonymous

О божечки.

использовать разворачивание циклов
мы уменьшим количество предсказаний переходов в четыре раза.

Вся суть хабра.

Дно дна.

TrueTsar1C
()
Ответ на: комментарий от abs

Тыж сам написал float mycos(const float x) { float _sin = mysin(x); return sqrt(1-_sin*_sin); }

Ну и, нахрена козе баян? Чем корень отличается от синуса? Ничем.

Чёт зря я недокопипастил приписку, там было: «так быстрее»

Т.е. как вычислить из синуса косинус быстрее чем за время вычисления самого косинуса.

TrueTsar1C
()
Ответ на: комментарий от TrueTsar1C

Как?

Примерно как ты написал:

 float mycos(const float x) {
    float _sin = mysin(x);
    return sqrt(1-_sin*_sin);
}

Только здесь:

  • не учитывается изменение знака косинуса, но для его учёта придётся if'ов понапихать и не факт, что тогда прямое вычисление будет медленее;
  • повторно вычисляется уже вычисленное значение синуса, вместо подстановки уже вычисленного ранее (одна и та же величина высчитывается два раза вместо одного) - проще уж тогда сразу напрямую косинус посчитать, а не через тригонометрическую формулу;
  • формула для синуса через используемое разложение (x - x3/6 + x3*x*x/120 - x3*x3*x/5040) всё равно неверна для используемых значений x: подставь x=4 и узри, что значение синуса внезапно больше 1 по модулю и при дальнейшем увеличении x продолжает очень быстро расти.
grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от grem

подставь x=4

А можно как-то быстро взять остачу от деления на дробное число? По идеи в голове всплыл алгоритм с логарифмическим временем работы

abs ★★★
()
Ответ на: комментарий от aedeph_

Вау, точно, я чет тупанул. Тогда вообще не понимаю почему они упоминают об проблемы что ряд сильно расходится при больших икс.

abs ★★★
()
Ответ на: комментарий от abs

Потому что надо об этом хотя бы немного помнить? Так-то очевидно, что если уж брать ряд, то аргумент привести где-нибудь к состоянию меньше 0.1 через формулы разнообразных двойных углов в помощь.

aedeph_ ★★
()
Ответ на: комментарий от grem

Примерно как ты написал:

Это написал не я и это говно. Корень ничем не отличается от косинуса, поэтому это не быстрее.

не учитывается изменение знака косинуса, но для его учёта придётся if'ов понапихать и не факт, что тогда прямое вычисление будет медленее;

Оно итак быстрее.

повторно вычисляется уже вычисленное значение синуса, вместо подстановки уже вычисленного ранее (одна и та же величина высчитывается два раза вместо одного) - проще уж тогда сразу напрямую косинус посчитать, а не через тригонометрическую формулу;

Это код тс"а.

формула для синуса через используемое разложение (x - x3/6 + x3*x*x/120 - x3*x3*x/5040) всё равно неверна для используемых значений

Она верна.

что значение синуса внезапно больше 1 по модулю и при дальнейшем увеличении x продолжает очень быстро расти.

Это не нужно, у пацана там умножение на пи, а что значит умножение на пи в коэффициенте, ибо ~дпф? - правильно, целая часть не учитывается и модуль нахрен не упал.

А так да, это дефолтный кастыль с редукций аргумента и я про него знаю.

TrueTsar1C
()
Ответ на: комментарий от abs

Вау, точно, я чет тупанул.

Проблема в точности. Каждый целый разряд у x уменьшает точность на дробныйр азряд у y соответственно.

TrueTsar1C
()
Ответ на: комментарий от TrueTsar1C

Если ты по полному названию формулы не можешь её найти и применить (это уровень 9-го класса) - есть большие сомнения в смысле чего бы то ни было.

aedeph_ ★★
()
Ответ на: комментарий от aedeph_

Если ты по полному названию формулы не можешь её найти и применить (это уровень 9-го класса) - есть большие сомнения в смысле чего бы то ни было.

Ну, я нашёл формулу. Как её применить в контексте задачи - отображение хотябы -pi:pi в диапазон в районе десятых - я не представляю. Вот я тебе спрашиваю, ибо сам не понимаю.

TrueTsar1C
()
Ответ на: комментарий от TrueTsar1C

Во-первых: -pi:pi -> (0, pi/4) при помощи sin(x) = cos(pi/2-x), cos(pi/2-2) = sin(x), sin(-x) = sin(x), cos(x) = cos(-x).

Во-вторых: pi/4 < 0.8; соответственно если x=8t, то t < 0.1, К sin(8t) и cos(8t) по три раза применить формулы двойных углов - получится полином по синусам и косинусам t, их и считать, собрав в итог.

Что-то подобное делается по ссылке, но вникать нет никакого желания.

aedeph_ ★★
()
Ответ на: комментарий от aedeph_

по три раза применить формулы двойных углов

Это как?

sin(2 * x) = 2 * cos(x) * sin(x)
sin(4 * x) = 4 * cos(x) ^ 3 * sin(x) - 4 cos(x) * sin(x) ^ 3

Чет гляжу я на это и мне нихрена не понятно как мы взяв 2раза первую получили вторую.

получится полином по синусам и косинусам t, их и считать, собрав в итог.

9-й класс и полином.

Что-то подобное делается по ссылке, но вникать нет никакого желания.

Почему же так? Большому дяде не интересно помочь школьнику что-то понять и сделать тем самым мир лучше? Это же прекрасно.

TrueTsar1C
()
Ответ на: комментарий от TrueTsar1C

Это как?

sin(4 * x) = sin(2 * (2 * x)) = 
= 2 * sin(2 * x) * cos(2 * x) =
= 2 * (2 sin(x) * cos(x)) * (cos(x) ^ 2 - sin(x) ^ 2) =
= 2 * 2 * sin(x) * cos(x) * cos(x) ^ 2 - 2 * 2 * sin(x) * cos(x) * sin(x) ^ 2 = 
= 4 * cos(x) ^ 3 * sin(x) - 4 cos(x) * sin(x) ^ 3

9-й класс и полином.

Да, страшное слово, которое означает сумму степеней.

aedeph_ ★★
()
Ответ на: комментарий от TrueTsar1C

Писал немного и именно по своему опыту говорю, что если есть приличная развивающаяся библиотека выполняющая нужные вычисления, типа FFT, вейвлетов, тригонометрии, той же длинной арифметики и т.д. стоит пользоваться ей. Если же нет, то тут уж в любом случае писать самому и выбирать все имеющиеся грабли.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от aedeph_
cos(2 * x) = 
= cos(x) ^ 2 - sin(x) ^ 2;

sin(2 * x) = 
= 2 * sin(x) * cos(x);

cos(4 * x) = cos(2 * (2 * x)) =
= cos(2 * x) ^ 2 - sin(2 * x) ^ 2 =
= (cos(x) ^ 2 - sin(x) ^ 2) ^ 2 - (2 * sin(x) * cos(x)) ^ 2;

sin(4 * x) = sin(2 * (2 * x)) =
= 2 * sin(2 * x) * cos(2 * x) =
= 2 * (2 * sin(x) * cos(x)) * (cos(x) ^ 2 - sin(x) ^ 2);


sin(8 * x) = sin(2 * (4 * x)) =
= 2 * sin(4 * x) * cos(4 * x) =
= 2 * (2 * (2 * sin(x) * cos(x)) * (cos(x) ^ 2 - sin(x) ^ 2)) * ((cos(x) ^ 2 - sin(x) ^ 2) ^ 2 - (2 * sin(x) * cos(x)) ^ 2);

Спасибо, как делать 2раза я понял. Странно, что я не додумался делить на два.

Теперь осталось понять как из этого сделать полином.

Да, страшное слово, которое означает сумму степеней.

Что такое полином в общем случае примитивно. Проблема в другом, а откуда мы берём коэффициенты для этих степеней.

TrueTsar1C
()
Ответ на: комментарий от Dark_SavanT

Писал немного и именно по своему опыту говорю

Понимаешь - тут есть такая штука как возможности и способности из которых вытекает желание.

Если ты обычный солостудент с посредственными способностями и малыми возможностями по времени/знаниям(которые и вытекают из способностей и времени) и прочему, то это одно дело. Если всё наоборот - это другое дело.

что если есть приличная развивающаяся библиотека выполняющая нужные вычисления

тригонометрии, той же длинной арифметики и т.д. стоит пользоваться ей.

Пользоваться говном? Ну да, наверное так проще.

Если же нет, то тут уж в любом случае писать самому и выбирать все имеющиеся грабли.

Это такое милое оправдание своей никчемности, что просто смешно.

Если ты пишешь математику, то ты в любом случае должен знать все грабли, в противном случае ты мусор. Проблема начинается тогда, когда ты путаешь домохозяйку, которая не пишет и пацана который пишет.

Домохозяйке да - лучше не писать.

TrueTsar1C
()
Ответ на: комментарий от aedeph_

И ещё, ты же юзал/юзаешь какие-то кас, либо ещё что-то. Подскажи, пж. Вот у меня есть функция приближения функции, тот же синус на конечных рядах - есть ли такие тулзы, которые умеют строить графики ошибок/разностей или как там это называется.

TrueTsar1C
()
Ответ на: комментарий от TrueTsar1C

Вольфрамальфа.

есть ли такие тулзы, которые умеют строить графики ошибок/разностей или как там это называется.

Для своих задач всегда писал свои.

aedeph_ ★★
()
Ответ на: комментарий от aedeph_

Ну раскрыть скобки это я осилю сам, хотя проще засунуть в вольфрам.

8 sin(x) cos^7(x)-56 sin^3(x) cos^5(x)+56 sin^5(x) cos^3(x)-8 sin^7(x) cos(x)

Ну что делать дальше? Как вынести икс? Разложить синусы/косинусы в ряды пастой из википедии, а потом как-то объединить в один?

TrueTsar1C
()
Ответ на: комментарий от TrueTsar1C

Ну что делать дальше? Как вынести икс?

Как то так.

anonymous
()
Ответ на: комментарий от aedeph_

Можно так

А как нужно?

выкидывая члены степени больше какого-то разумного числа.

Ну попытаюсь сделать руками, авось что-то пойму.

TrueTsar1C
()
Ответ на: комментарий от TrueTsar1C

Откуда я знаю как нужно? Это относительно неплохая задачка на довольно приличный анализ, за который мне деньги не платят.

Я считаю, что оптимальный подход - небольшая табличка на 0:pi/4 (а может и на все pi/2) из разложений в каждой табличной точке с приближением через ряд Тейлора (так как числа будут близкие количество членов ряда, которые надо взять, будет крайне мало). Но реально заморачиваться с аккуратными выкладками, оценками точности и машинными погрешностями мне не хочется.

aedeph_ ★★
()
Ответ на: комментарий от TrueTsar1C

Если ты пишешь математику, то ты в любом случае должен знать все грабли, в противном случае ты мусор.

вот здесь ты уже кой-чего написал:

Накидайте задачек.

а если про синусы — там нужно знать математику чуть сложнее 9-го классса вообще и многочленов в частности.

anonymous
()

хочешь производительности? тогда запомни, никогда не пиши свою математику, за тебя это уже сто раз написали и отладили. Раз ты затачиваешься под Xeon, так возьми от него все, что он может дать. Воспользуйся уже MKL, ICC и OpenMP, как советует производитель этого самого Xeon'а и будет тебе счастье.

EugeneBas ★★
()
Ответ на: комментарий от anonymous

вот здесь ты уже кой-чего написал:

И что же, можно конкретней.

а если про синусы — там нужно знать математику чуть сложнее 9-го классса

Куллстори. Я прям так и вижу синусы от школьников, акромя пасты, либо уже готового, либо тейлора из википедии/касули.

и многочленов в частности

И конечно же на уровне 9-го класса. Где же эти синусы от школьников?

TrueTsar1C
()
Ответ на: комментарий от aedeph_

Откуда я знаю как нужно?

Ну вот пацаны пишут, что тейлор говно и курить надо в этом http://en.wikipedia.org/wiki/Minimax_approximation_algorithm направлении.

Я считаю, что оптимальный подход - небольшая табличка на 0:pi/4 (а может и на все pi/2) из разложений в каждой табличной точке с приближением через ряд Тейлора (так как числа будут близкие количество членов ряда, которые надо взять, будет крайне мало).

Слишком тормазит. Это больше мультипроцессорный, гпушный подход.

Но реально заморачиваться с аккуратными выкладками, оценками точности и машинными погрешностями мне не хочется.

Да это и не надо. Просто мб направишь в какую сторону копать. Я вон запилил дефолтный тейлор - слишком днище, ибо 15степеней только на точность флоата. Пацаны не обманули.

TrueTsar1C
()
Ответ на: комментарий от TrueTsar1C

Ну вот пацаны пишут, что тейлор говно и курить надо в этом http://en.wikipedia.org/wiki/Minimax_approximation_algorithm направлении.

Не исключаю. Но обоснованием может являться только самостоятельный анализ - аккуратно ставится задача, решается оптимально задача с Тейлором, потом также оптимально решается задача с разнообразными интерполяциями, в том числе чебышёвскими, потом медитация над результатами.

Слишком тормазит.

Детский сад.

aedeph_ ★★
()
Ответ на: комментарий от TrueTsar1C

Точное количество членов, возможно приведение к единообразному виду во время уменьшения аргументов удвоением, разбор областей и переводов по периодам. Может быть даже байтоложество и прочие аутические низкоуровневые оптимизации (но только после аналитического исследования, разумеется).

aedeph_ ★★
()
Ответ на: комментарий от TrueTsar1C

Детский сад что?

«Слишком тормазит» - комментарий уровня тупорылой нулевой анскильной лалки, непонимающей, о чём она мычит.

aedeph_ ★★
()
Ответ на: комментарий от aedeph_

«Слишком тормазит» - комментарий уровня тупорылой нулевой анскильной лалки, непонимающей, о чём она мычит.

Конкретней. Что стоит за твоими словами? Кроме второсортной попытки пародировать меня, когда нечего сказать.

TrueTsar1C
()
Ответ на: комментарий от TrueTsar1C

За моими словами стоит чёткое осознание, что ты не в состоянии был проанализировать весь спектр табличных методов, относительно которых я писал. Даже прямолинейная аппроксимация тейлором легко может быть приведена к этой формулировке.

Поэтому без конкретных деталей реализации, конкретной модели и конкретных методов «слишком тормазит» - это детский лепет анскильной лалки.

aedeph_ ★★
()
Ответ на: комментарий от aedeph_

За моими словами стоит чёткое осознание

Ничего за ними не стоит.

что ты не в состоянии был проанализировать весь спектр табличных методов,

Есть законы матчасти - есть конкретная стоимость табличного метода(любого), дак вот - эта стоимость сливает в говнище примитивной реализации на примитивных рядах. При любых раскладах в данном контексте.

Поэтому без конкретных деталей реализации, конкретной модели и конкретных методов «слишком тормазит» - это детский лепет анскильной лалки.

Какие ещё детали реализации, таблица - скалярное говно - это уже нонсенс на уровне кода, который пытается хоть немного намекать на производительность.

Ну как тебе, чтоб понятней было - в самом наилучшем случае для таблицы, стоимость одного табличного чтения - 33 степени в ряде, т.е. 16умножений и 16сложений.

TrueTsar1C
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.