LINUX.ORG.RU

История изменений

Исправление www_linux_org_ru, (текущая версия) :

Скажите, когда Вы

я, вообще-то, привык общаться в обе стороны на «ты» и переучиваться мне лень (хотя ниче не имею против обращения ко мне на «вы»)

Скажите, когда Вы предлагаете выполнять компиляцию, до исполнения или во время исполнения программы? Иными словами, Вы сторонник статической компиляции или JIT?

И мед, и сгущенку, и можно без хлеба. (с) винни-пух

а если серьезно, то все, что можно сделать статически — нужно делать статически

т.е.

1. самое лучшее — статическая компиляция

2. если это не проходит — тогда нужен псевдо-jit, опирающися на железо

3. если это не проходит — тогда псевдо-jit, не опирающися на железо

4. иначе настоящий jit

что я понимаю под п.2 можно понять из кода ниже (неоптимизированная версия — это OPT0; п.2 это OPT2 и OPT3) что такое п.3 объяснять лень

#include <iostream>
#include <vector>

typedef unsigned int uint;
const int it=50000000;
const int len=200;

struct Figure {
  virtual uint area() = 0;
};

struct Rect: public Figure {
  uint x;
  uint y;
  Rect(uint x=1, uint y=1): x(x), y(y) {}
  virtual uint area() { return x+y; } /// cделано для скорости
  static inline uint area_static(Rect* r) { return r->area(); }
};

struct Circle: public Figure { 
  uint radius;
  Circle(uint radius=1): radius(radius) {}
  virtual uint area() { return radius; } /// cделано для скорости
};

#ifdef OPT0
uint func1(std::vector<Figure*> v) {
  uint res = 0;
  for(int i=0; i<it; ++i ) {
    for( auto iterator=v.begin(); iterator!=v.end(); ++iterator ) {
      auto element = *iterator;
      res += element->area();
    }
  }
  return res;
}
#endif

#ifdef OPT1
uint func1(std::vector<Figure*> v) {
  static Rect _rect;
  uint res = 0;
  for(int i=0; i<it; ++i ) {
    for( auto iterator=v.begin(); iterator!=v.end(); ++iterator ) {
      auto element = *iterator;
      if( auto rect_ptr = dynamic_cast<Rect*>(element) ) {
        res += rect_ptr->area();
      }else{
        res += element->area();
      }
    }
  }
  return res;
}
#endif

#ifdef OPT2
uint func1(std::vector<Figure*> v) {
  static Rect _rect;
  uint res = 0;
  for(int i=0; i<it; ++i ) {
    for( auto iterator=v.begin(); iterator!=v.end(); ++iterator ) {
      auto element = *iterator;
      if( *(reinterpret_cast<uint*>(element)) == *(reinterpret_cast<uint*>(&_rect))  ) {
        Rect* rect_ptr = reinterpret_cast<Rect*>(element);
        res += rect_ptr->area();
      }else{
        res += element->area();
      }
    }
  }
  return res;
}
#endif

#ifdef OPT3
uint func1(std::vector<Figure*> v) {
  static Rect _rect;
  uint res = 0;
  for(int i=0; i<it; ++i ) {
    for( auto iterator=v.begin(); iterator!=v.end(); ++iterator ) {
      auto element = *iterator;
      if( *(reinterpret_cast<uint*>(element)) == *(reinterpret_cast<uint*>(&_rect))  ) {
        Rect* rect_ptr = reinterpret_cast<Rect*>(element);
        res += Rect::area_static(rect_ptr);
      }else{
        res += element->area();
      }
    }
  }
  return res;
}
#endif

int main()
{
  std::vector<Figure*> v(len);
  for( uint i=0; i<len; ++i ) {
    v[i] = ( i%32==0 ? (Figure*) new Circle() : (Figure*) new Rect() );
  }
  std::cout << func1(v) << std::endl;
  return 0;
}

Исходная версия www_linux_org_ru, :

Скажите, когда Вы

я, вообще-то, привык общаться в обе стороны на «ты» и переучиваться мне лень (хотя ниче не имею против обращения ко мне на «вы»)

Скажите, когда Вы предлагаете выполнять компиляцию, до исполнения или во время исполнения программы? Иными словами, Вы сторонник статической компиляции или JIT?

И мед, и сгущенку, и можно без хлеба. (с) винни-пух

а если серьезно, то все, что можно сделать статически — нужно делать статически

т.е.

1. самое лучшее — статическая компиляция

2. если это не проходит — тогда нужен псевдо-jit, опирающися на железо

3. если это не проходит — тогда псевдо-jit, не опирающися на железо

4. иначе настоящий jit

что я понимаю под п.2 можно понять из кода ниже (неоптимизированная версия — это OPT0; п.2 это OPT2 и OPT3; что такое п.3 объяснять лень)

#include <iostream>
#include <vector>

typedef unsigned int uint;
const int it=50000000;
const int len=200;

struct Figure {
  virtual uint area() = 0;
};

struct Rect: public Figure {
  uint x;
  uint y;
  Rect(uint x=1, uint y=1): x(x), y(y) {}
  virtual uint area() { return x+y; } /// cделано для скорости
  static inline uint area_static(Rect* r) { return r->area(); }
};

struct Circle: public Figure { 
  uint radius;
  Circle(uint radius=1): radius(radius) {}
  virtual uint area() { return radius; } /// cделано для скорости
};

#ifdef OPT0
uint func1(std::vector<Figure*> v) {
  uint res = 0;
  for(int i=0; i<it; ++i ) {
    for( auto iterator=v.begin(); iterator!=v.end(); ++iterator ) {
      auto element = *iterator;
      res += element->area();
    }
  }
  return res;
}
#endif

#ifdef OPT1
uint func1(std::vector<Figure*> v) {
  static Rect _rect;
  uint res = 0;
  for(int i=0; i<it; ++i ) {
    for( auto iterator=v.begin(); iterator!=v.end(); ++iterator ) {
      auto element = *iterator;
      if( auto rect_ptr = dynamic_cast<Rect*>(element) ) {
        res += rect_ptr->area();
      }else{
        res += element->area();
      }
    }
  }
  return res;
}
#endif

#ifdef OPT2
uint func1(std::vector<Figure*> v) {
  static Rect _rect;
  uint res = 0;
  for(int i=0; i<it; ++i ) {
    for( auto iterator=v.begin(); iterator!=v.end(); ++iterator ) {
      auto element = *iterator;
      if( *(reinterpret_cast<uint*>(element)) == *(reinterpret_cast<uint*>(&_rect))  ) {
        Rect* rect_ptr = reinterpret_cast<Rect*>(element);
        res += rect_ptr->area();
      }else{
        res += element->area();
      }
    }
  }
  return res;
}
#endif

#ifdef OPT3
uint func1(std::vector<Figure*> v) {
  static Rect _rect;
  uint res = 0;
  for(int i=0; i<it; ++i ) {
    for( auto iterator=v.begin(); iterator!=v.end(); ++iterator ) {
      auto element = *iterator;
      if( *(reinterpret_cast<uint*>(element)) == *(reinterpret_cast<uint*>(&_rect))  ) {
        Rect* rect_ptr = reinterpret_cast<Rect*>(element);
        res += Rect::area_static(rect_ptr);
      }else{
        res += element->area();
      }
    }
  }
  return res;
}
#endif

int main()
{
  std::vector<Figure*> v(len);
  for( uint i=0; i<len; ++i ) {
    v[i] = ( i%32==0 ? (Figure*) new Circle() : (Figure*) new Rect() );
  }
  std::cout << func1(v) << std::endl;
  return 0;
}