Производительность языков. Объектный Фибоначчи :)

 
1 2 3 4 5
RU Balancer #24.11.2008 12:09  @RomanMak#24.11.2008 11:51
+
-
edit
 

Balancer

администратор
★★★★☆
RomanMak> Кто ж так на Джаве пишет! :-)

Тогда уже почему бы не считать Фибоначчи итеративно? Или с хвостовой переменной?

См. с самого начала для чего предназначен этот тест.
 
+
-
edit
 

Balancer

администратор
★★★★☆
Про Boo по наводке с Новости - OpenSource - Вышел Boo 0.9

Система с тех пор пару раз обновлялась и не в пользу boo :)

Сейчас стоят Boo Compiler version 0.8.1.2865 (CLR v2.0.50727.42) с mono 1.9.1

Время теста со статической типизацией увеличилось с 9,8 сек. до 12,1.

Подсказали проверить утиную типизацию, Boo её умеет, хотя тоже надо указывать явно:

code python
  1. class Fib:
  2.     _value as duck
  3.  
  4.     def constructor(n as duck):
  5.         _value = n
  6.  
  7.     def value() as duck:
  8.         if(_value <= 2):
  9.             return 1
  10.  
  11.         return Fib(_value - 1).value() + Fib(_value - 2).value()
  12.  
  13. print Fib(40).value()


Утиная типизация работает много тормознее - 145 секунд.
 
+
-
edit
 

zergen

новичок
Новая (очень) грубо версия на плюсах с пулом из Boost - ибо классический случай: куча созданий/удалений мелких объектов фиксированного размера. Заодно погонял и ваши версии на С++.
Результаты в секундах:
code text
  1. new             169.5
  2. new_pool        99.2
  3. stack           5.8

Код с пулом:
code cpp
  1. #include
  2.  
  3. #include
  4.  
  5. class Fib
  6. {
  7.   private:
  8.      int _value;
  9.   public:
  10.     Fib(int n) { _value = n; }
  11.     static void* operator new (size_t size);
  12.     static void operator delete (void *p);
  13.     int value()
  14.     {
  15.         if(_value <= 2)
  16.             return 1;
  17.         Fib *f1 = new Fib(_value - 1);
  18.         Fib *f2 = new Fib(_value - 2);
  19.         int n1 = f1->value();
  20.         int n2 = f2->value();
  21.         delete(f1);
  22.         delete(f2);
  23.         return n1+n2;
  24.     }
  25. };
  26. struct MyPoolTag { };
  27. typedef boost::singleton_pool FibPool;
  28. void* Fib::operator new (size_t size)
  29. {
  30.     void *p = FibPool::malloc();
  31.     return p;
  32. }
  33. void Fib::operator delete (void *p)
  34. {
  35.     FibPool::free(p);
  36. }
  37. int main()
  38. {
  39.     for(int i=0; i<10; i++)
  40.     {
  41.         Fib *x = new Fib(40);
  42.         printf("n=%d\n", x->value());
  43.         delete(x);
  44.     }
  45.     return 0;
  46. }
 3.0.53.0.5
+
-
edit
 

Balancer

администратор
★★★★☆
Мне тут по почте подбросили версию на D и на ЛОРе - версию на O'Caml.

Но проверить сейчас в тех же условиях не могу, чуть позже.
 
+
-
edit
 

Balancer

администратор
★★★★☆
Да, сами варианты.

(Автор: Александр Суховерхов)

D с кучей:
code d
  1. import std.stdio;
  2.  
  3. class Fib
  4. {
  5.   private:
  6.     int _value;
  7.  
  8.   public:
  9.     this(int n) { _value = n; }
  10.  
  11.     int value()
  12.     {
  13.         if(_value <= 2)
  14.             return 1;
  15.  
  16.         scope Fib f1 = new Fib(_value - 1);
  17.         scope Fib f2 = new Fib(_value - 2);
  18.  
  19.         return f1.value() + f2.value();
  20.     }
  21. };
  22.  
  23. int main()
  24. {
  25.     for (int i = 0; i < 10; i++)
  26.     {
  27.         scope Fib x = new Fib(40);
  28.         writefln("n=", x.value);
  29.     }
  30.     return 0;
  31. }


D со стеком:

code d
  1. import std.stdio;
  2.  
  3. struct Fib
  4. {
  5.   private:
  6.     int _value;
  7.  
  8.   public:
  9.     this(int n) { _value = n; }
  10.  
  11.     int value()
  12.     {
  13.         if(_value <= 2)
  14.             return 1;
  15.  
  16.         scope Fib f1 = Fib(_value - 1);
  17.         scope Fib f2 = Fib(_value - 2);
  18.  
  19.         return f1.value() + f2.value();
  20.     }
  21. };
  22.  
  23. int main()
  24. {
  25.     for (int i = 0; i < 10; i++)
  26.     {
  27.         scope Fib x = Fib(40);
  28.         writefln("n=", x.value);
  29.     }
  30.     return 0;
  31. }
 
+
-
edit
 

Balancer

администратор
★★★★☆
Вариант на O'Caml. Источник: Новости - OpenSource - Вышел Boo 0.9

code ocaml
  1. class fib n =
  2.         object
  3.           val v = n
  4.           method value = match v with
  5.                          1 | 2 -> 1
  6.                          | i -> (new fib(i-1))#value + (new fib(i-2))#value
  7.         end;;
 
+
-
edit
 

Balancer

администратор
★★★★☆
Вариант на F#: Новости - OpenSource - Вышел Boo 0.9

code fsharp
  1. #light
  2. open System
  3.  
  4. type test(i: int)=
  5.     let rec I = i
  6.     member x.value =  match I with
  7.                       1 | 2 -> 1
  8.                       | I -> (new test(I-1)).value + (new test(I-2)).value
  9. ;;


У автора время исполнения 5 сек. под .Net/Windows и 11 сек. под Mono/Linux.
 
+
-
edit
 

HolyBoy

аксакал

Ещё раз затестировал Ruby:

ruby18 8m24.653s 1.8.7_p72-r10
ruby19 3m11.338s 1.9.1

Тестовый пример твой, с первой страницы. Поскольку компьютер у меня помощнее чутка, то результаты выглядят немного странно.
 
+
-
edit
 

Balancer

администратор
★★★★☆
HolyBoy> Поскольку компьютер у меня помощнее чутка, то результаты выглядят немного странно.

Почему? Ruby 1.8 у тебя 8 минут, у меня - 10. Вполне. Или мощность компа непропорционально выше? М.б. собран Ruby менее оптимально?
 
+
-
edit
 

HolyBoy

аксакал

Balancer> Или мощность компа непропорционально выше?

Ога. AMD Athlon(tm) 64 X2 Dual Core Processor 4400+, Mem: 2025 Mb

Balancer> М.б. собран Ruby менее оптимально?

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

CFLAGS="-O2 -march=i686 -mtune=athlon64 -pipe -fomit-frame-pointer"
 
+
-
edit
 

Balancer

администратор
★★★★☆
Balancer>> Или мощность компа непропорционально выше?
HolyBoy> Ога. AMD Athlon(tm) 64 X2 Dual Core Processor 4400+, Mem: 2025 Mb

Сколько там мегагерц у него? Считать по ним надо. Плавучка никакая и SSE не используются, ядро только одно используется :)

...

Надо писать для тестов многопоточного Фибоначчи :) Два числа - два потока :) Хотя это уже будет стресстест на число потоков в виртмашине или ОС. ИМХО, победит Эрланг ;)
 
+
-
edit
 

HolyBoy

аксакал

Balancer> Сколько там мегагерц у него?

До 2.30 GHz
 
+
-
edit
 

Balancer

администратор
★★★★☆
HolyBoy> До 2.30 GHz

А у меня - 1.86

Вот в этих пропорциях примерно и ускорение :)
 
RU Balancer #03.04.2009 19:45  @Balancer#03.04.2009 19:41
+
-
edit
 

Balancer

администратор
★★★★☆
HolyBoy>> До 2.30 GHz
Balancer> А у меня - 1.86
Balancer> Вот в этих пропорциях примерно и ускорение :)

Можно сравнить:

2.30/1.86 = 1.24

Для Ruby 1.8, 662 секунды моих / 505 секунд твоих = 1.31

Для 1.9 - 310/191 = 1.62

Небольшое превышение за счёт более быстрой памяти и/или оптимальной сборки :)
 
+
-
edit
 

HolyBoy

аксакал

Balancer> Для 1.9 - 310/191 = 1.62
Balancer> Небольшое превышение за счёт более быстрой памяти и/или оптимальной сборки :)

Скорее, версии, т.к. сборка неоптимальная была. Показал же. Я тестировал 1.9.1, а ты вроде бы 1.9.0.
 
+
-
edit
 

Balancer

администратор
★★★★☆
Переписал [code]-блоки. Теперь поддерживаются все языки, упомянутые в этой теме :)
 
+
-
edit
 

zyxman

опытный

И я сейчас поругаюсь на сфероконечность теста.

Вот бенчмарк на создание объектов и get/set и тут явно видно особенность динамического языка - в зависимости от пакета создающего объекты может очень сильно плавать и скорость создания и скорость доступа:

./test2.pl
benchmark new()
Class::Accessor
timethis 200000: 3 wallclock secs ( 2.50 usr + 0.00 sys = 2.50 CPU) @ 80000.00/s (n=200000)
Class::MakeMethods::Standard::Hash
timethis 200000: 2 wallclock secs ( 1.83 usr + 0.00 sys = 1.83 CPU) @ 109289.62/s (n=200000)
Class::MethodMaker
timethis 200000: 1 wallclock secs ( 0.88 usr + 0.00 sys = 0.88 CPU) @ 227272.73/s (n=200000)
Object::InsideOut
timethis 200000: 94 wallclock secs (88.31 usr + 0.08 sys = 88.39 CPU) @ 2262.70/s (n=200000)
benchmark get/set
Class::Accessor
timethis 200000: 1 wallclock secs ( 1.73 usr + 0.00 sys = 1.73 CPU) @ 115606.94/s (n=200000)
Class::MakeMethods::Standard::Hash
timethis 200000: 1 wallclock secs ( 0.74 usr + 0.01 sys = 0.75 CPU) @ 266666.67/s (n=200000)
Class::Member::HASH
timethis 200000: 6 wallclock secs ( 5.91 usr + 0.00 sys = 5.91 CPU) @ 33840.95/s (n=200000)
Class::MethodMaker
timethis 200000: 1 wallclock secs ( 0.60 usr + 0.00 sys = 0.60 CPU) @ 333333.33/s (n=200000)
Object::InsideOut
timethis 200000: 1 wallclock secs ( 0.58 usr + 0.01 sys = 0.59 CPU) @ 338983.05/s (n=200000)

#!/usr/bin/perl
use Benchmark qw(:all);
require ClassTest::Accessor;
require ClassTest::MakeMethods;
require ClassTest::Member;
require ClassTest::MethodMaker;
require ClassTest::ObjectInsideOut;
my $count = 200000;
my $o_A    = ClassTest::Accessor->new();
my $o_MMs  = ClassTest::MakeMethods->new();
my $o_M    = ClassTest::Member->new();
my $o_MM    = ClassTest::MethodMaker->new();
my $o_IO    = ClassTest::ObjectInsideOut->new();
clearallcache();
print "benchmark new()\n";
print "Class::Accessor\n";
timethis( $count, sub { my $o = ClassTest::Accessor->new(); } );
clearallcache();
print "Class::MakeMethods::Standard::Hash\n";
timethis( $count, sub { my $o = ClassTest::MakeMethods->new(); } );
clearallcache();
#print "Class::Member::HASH\n";
#timethis( $count, sub { my $o = ClassTest::Member->new(); } );
clearallcache();
print "Class::MethodMaker\n";
timethis( $count, sub { my $o = ClassTest::MethodMaker->new(); } );
clearallcache();
print "Object::InsideOut\n";
timethis( $count, sub { my $o = ClassTest::ObjectInsideOut->new(); } );
clearallcache();
print "benchmark get/set\n";
print "Class::Accessor\n";
timethis( $count, sub { $o_A->test('test'); $o_A->test(); } );
clearallcache();
print "Class::MakeMethods::Standard::Hash\n";
timethis( $count, sub { $o_MMs->test('test'); $o_MMs->test(); } );
clearallcache();
print "Class::Member::HASH\n";
timethis( $count, sub { $o_M->test('test'); $o_M->test(); } );
clearallcache();
print "Class::MethodMaker\n";
timethis( $count, sub { $o_MM->test('test'); $o_MM->test(); } );
clearallcache();
print "Object::InsideOut\n";
timethis( $count, sub { $o_IO->test('test'); $o_IO->test(); } );
clearallcache();
называть крепостное право рабством - это просто за пределами любой логики и здравого смысла (с) Fakir Если ничего не делать то точно ничего не будет, а если делать и искать, то что-то может получиться ;)  1.5.0.61.5.0.6
+
-
edit
 

Balancer

администратор
★★★★☆
Новый тест. Очень интересный язык fan: Новости - OpenSource - Парни из Ричмонда разработали язык Fan на замену C# и Java

Машина уже не та, операционка другая, версии компиляторов - другие, так что примерный подсчёт. Опорные точки:

c++ heap [gcc версия 4.3.4 (Gentoo 4.3.4 p1.0, pie-10.1.5)] - 20,9 сек. Соотношение к базовому тесту 1,26

java [не -server, build 1.6.0_16-b01] - 4,99сек. или отношение 1,28

Грубо примем соотношение производительности нынешней машины к тестовой, как 1:1,27.

Вариант на fan выполнился за 6,25 сек. Или в старом тесте это будет, соответственно, 6,25/1,27 = 4,9 сек. Туда и впишем.

Исходный код:
code text
  1. class FibObj
  2. {
  3.     Int _value
  4.  
  5.     new make(Int n) { _value = n }
  6.  
  7.     public Int value()
  8.     {
  9.         if(_value <= 2)
  10.             return 1
  11.  
  12.         FibObj f1 := FibObj(_value - 1)
  13.         FibObj f2 := FibObj(_value - 2)
  14.  
  15.         return f1.value() + f2.value()
  16.     }
  17.  
  18.     static Void main(Str[] argv)
  19.     {
  20.         for(Int i:=0; i<10; i++)
  21.         {
  22.             FibObj x := FibObj(40)
  23.             echo(x.value())
  24.         }
  25.     }
  26. }
 
+
-
edit
 

Balancer

администратор
★★★★☆
Обнаружилось, что очень большой прирост дала java с ключиком -server

Было 2,5 сек., т.е. при пропорции 1:1,27 сейчас должно быть 3,2сек. А вышло - 2,33 :)

Видимо, у Sun что-то заметно подкрутили.

Делаю несколько новых опорных тестов:

C#/mono - 12,8сек. Пропорция 1,15. Несколько меньше, чем 1,27, но mono более новый. Возможно, подкрутили тоже немного. Всё же, v1.2.6.0 -> v2.4.2.3

...

(ещё несколько тестов прогоню, результат в это же сообщение допишу)
 
RU Balancer #21.09.2009 02:02  @Balancer#24.11.2008 07:54
+
-
edit
 

Balancer

администратор
★★★★☆
> from psyco.classes import metaclass

Чёрт, не работает для новых тестов. Python 2.5 у меня в системе уже неполноценен, и psyco ругается тупо «ImportError: No module named psyco.classes», а в 2.6, видно, что-то поменялось: «ImportError: cannot import name _metaclass_».

Ладно, отложим пока...
 
+
-
edit
 

waveM

новичок
Возможно, я что-то не догоняю... Зачем городить огород с созданием новых экземпляров объекта и уж тем более с использованием кучи, когда прошлые вычисления можно запомнить, и они общие для всех экземпляров класса?
И чем вариант со стеком на с++ будет отличаться от варианта на Ruby в таком виде:

code text
  1.  
  2. class Fib
  3. private
  4.     @@hashValue=Hash.new(0)            
  5.     @@hashValue[0] = @@hashValue[1] = @@hashValue[2] = 1
  6. public
  7.     def self.value(n)
  8.         if ( @@hashValue[n]==0 )
  9.                         @@hashValue[n] = Fib.value(n - 1) + Fib.value(n - 2)
  10.         end
  11.         return @@hashValue[n]
  12.     end
  13. end
  14.  
  15. print Fib.value(240)


Если религия не позволяет изпользовать метаклассы, можно перемнные вернуть экземпляру, но использовать синглтон, в Руби это просто.

Для меня преимущества Руби в данном случае в поддержке больших целых чисел из коробки (использую 1.9.1), на С++ вызов с аргументом 240 можно поддерживать только с применением сторонней библиотеки

для небольших аргументов тот же подход допустим, я думаю в любых языках, поскольку информация о содержимом Fib(x) - глобальна, то использовать можно любое глобальное хранилище, вплоть до глобальной переменной или ячейки глобального хэша (если параллелизации и безопасности важны, то тут уже не все так гладко, но опять же - тогда использовать синглтон)
 3.0.195.213.0.195.21
Это сообщение редактировалось 21.09.2009 в 04:45
+
-
edit
 

Balancer

администратор
★★★★☆
waveM> Возможно, я что-то не догоняю... Зачем городить огород с созданием новых экземпляров объекта

Потому что это цель теста. Поверь, для простого вычисления чисел Фибоначчи есть куда более подходящие способы :D

waveM> И чем вариант со стеком на с++

Я тут подобрал более актуальный пример (ближе к реалиям), но тестить буду позже и уже в отдельной теме. Вот, например, вариант на Java:
code java
  1. class FibObj2
  2. {
  3.         private int _value;
  4.         private FibObj2 _prev1;
  5.         private FibObj2 _prev2;
  6.         private int[] _foo = new int[20];
  7.  
  8.         private final void _init(int n)
  9.         {
  10.                 _prev1 = new FibObj2(n-1);
  11.                 _prev2 = new FibObj2(n-2);
  12.         }
  13.  
  14.         private final void _free()
  15.         {
  16.                 _prev1 = null;
  17.                 _prev2 = null;
  18.         }
  19.  
  20.         FibObj2(int n)
  21.         {
  22.                 _value = n;
  23.  
  24.                 for(int i=0; i<20; i++)
  25.                         _foo[i] = 0;
  26.         }
  27.  
  28.         public int value()
  29.         {
  30.                 if(_value <= 2)
  31.                         return 1;
  32.  
  33.                 _init(_value);
  34.                 int res = _prev1.value() + _prev2.value() + _prev1.foo() + _prev2.foo();
  35.                 _free();
  36.                 return res;
  37.         }
  38.  
  39.         public int foo()
  40.         {
  41.                 int sum = 0;
  42.                 for(int i=0; i<20; i++)
  43.                         sum += _foo[i];
  44.  
  45.                 return sum;
  46.         }
  47.  
  48.         public static void main(String[] argv)
  49.         {
  50.                 for(int i=0; i<10; i++)
  51.                 {
  52.                         FibObj2 x = new FibObj2(33);
  53.                         System.out.println(x.value());
  54.                 }
  55.         }
  56. }


Вот на C++
code c++
  1. #include <stdio.h>
  2.  
  3. #define SIZE 20
  4.  
  5. class FibObj2
  6. {
  7.   private:
  8.      int _value, _foo[SIZE];
  9.      FibObj2 *_prev1, *_prev2;
  10.  
  11.     void _init(int n)
  12.     {
  13.         _prev1 = new FibObj2(n-1);
  14.         _prev2 = new FibObj2(n-2);
  15.     }
  16.  
  17.     void _free()
  18.     {
  19.         delete(_prev1);
  20.         delete(_prev2);
  21.     }
  22.  
  23.   public:
  24.     FibObj2(int n)
  25.     {
  26.         _value = n;
  27.         for(int i=0; i<SIZE; i++)
  28.             _foo[i] = 0;
  29.     }
  30.  
  31.     int value()
  32.     {
  33.         if(_value < 3)
  34.             return 1;
  35.         _init(_value);
  36.         int res = _prev1->value() + _prev2->value() + _prev1->foo() + _prev2->foo();
  37.         _free();
  38.         return res;
  39.     }
  40.  
  41.     int foo()
  42.     {
  43.         int sum = 0;
  44.         for(int i=0; i<SIZE; i++)
  45.             sum += _foo[i];
  46.         return sum;
  47.     }
  48. };
  49.  
  50. int main()
  51. {
  52.     for(int i=0; i<10; i++)
  53.     {
  54.         FibObj2 *x = new FibObj2(33);
  55.         printf("n=%d\n", x->value());
  56.         delete(x);
  57.     }
  58.     return 0;
  59. }


Сделай его на стеке - сравним :)
 
+
-
edit
 

waveM

новичок
waveM>> Возможно, я что-то не догоняю... Зачем городить огород с созданием новых экземпляров объекта
Balancer> Потому что это цель теста. Поверь, для простого вычисления чисел Фибоначчи есть куда более подходящие способы :D
waveM>> И чем вариант со стеком на с++
Balancer> Я тут подобрал более актуальный пример (ближе к реалиям), но тестить буду позже и уже в отдельной теме. Вот, например, вариант на Java:
Balancer> Сделай его на стеке - сравним :)

На С++? С удовольствием! :-) Но для начала, что же мы тестируем? В зависимости от этого решения будут разными
1) Если хвостовую рекурсию, то мне нужно разворачивать рекурсию в момент компиляции (привет от Александреску!)
2) Ежели просто грамотное использование объектами кучи (run-time), то тогда выяснить сколько объектов нужно для вычисления максимального пути (N-2), запросить N объектов и разложив их в ячейки 0..N брать значение из объектов в ячейках
Но это по сути я уже приводил на Руби выше, на С++ ожидаю просто быстрее.
3) Если же просто много раз создать удалить и попутно просчитать сумму для каждого, то это тестирование используемого менеджера памяти в бОльшей степени, а также размера кэшей процессора и его влияния на текущую ф-цию.
4) Если мы тестируем вообще компилятор одного языка vs другого, то это вообще не очень корректно с чем либо, что не реализовано абсолютно точно так же
...
т.е. по-прежнему не понимаю, что же имено мы тестируем?
 
+
-
edit
 

Balancer

администратор
★★★★☆
waveM> На С++? С удовольствием! :-) Но для начала, что же мы тестируем? В зависимости от этого решения будут разными

Топикстартовый тест. Есть объект Fib, содержащий в себе один property value. И метод value(), который возвращает рекурсивно расчитываемое число Фибоначчи через генерацию двух таких же объектов, инициализирующихся значениями (n-1) и (n-2).

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

Поэтому навскидку сформирована новая задача.

Кроме всего упомянутого выше, есть пустой массив из 20 элементов (на глаз - типовое значение среднего числа свойств объекта). Нужно при инициализации класса занулить эти элементы (именно индивидуальные обращения... Пожалуй, чтобы не было соблазна заюзать memset (мы тестируем не скорость зануления, а скорость обращения), можно заменить прямые обращения на геттеры/сеттеры - да, наверное, так и сделаю к релизному тесту), при вычислении value вызвать для каждого объекта-источника данных метод foo(), который суммирует значения этих свойств.

Перед расчётом значения value() нужно дополнительно проинициализировать класс, загрузив объекты prev1 и prev2 для (n-1) и (n-2). После вызова можно освободить.

Инициализация не включена в конструктор (первоначально так думал сделать), так как иначе для 33-го числа не хватит никакой памяти :)

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

waveM> 1) Если хвостовую рекурсию, то мне нужно разворачивать рекурсию в момент компиляции (привет от Александреску!)

При чём тут хвостовая рекурсия? Нас интересует жонглирование объектами. С рекурсией - это к Аккерману :) Древние топики Мерянье пи... э... попугаями. Быстродействие языков. и Быстродействие языков тест2

waveM> 2) Ежели просто грамотное использование объектами кучи (run-time), то тогда выяснить сколько объектов нужно для вычисления максимального пути (N-2), запросить N объектов и разложив их в ячейки 0..N брать значение из объектов в ячейках

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

waveM> т.е. по-прежнему не понимаю, что же имено мы тестируем?

Выполнение вышеописанного алгоритма :)
 
+
-
edit
 

waveM

новичок
Хмм, а почему тогда не рассматривается такой вариант на С++?

code text
  1. #include <stdio.h>
  2.  
  3. #define SIZE 20
  4.  
  5. class FibObj2
  6. {
  7.   private:
  8.          int _value, _foo[SIZE];
  9.          int doom1;
  10.          int doom2;
  11.  
  12.   public:
  13.         FibObj2(int n)
  14.         {
  15.                 _value = n;
  16.                 for(int i=0; i<SIZE; i++)
  17.                         _foo[i] = 0;
  18.         }
  19.  
  20.         int value()
  21.         {
  22.                 if(_value < 3)
  23.                         return 1;
  24.                 FibObj2 _prev1(_value-1), _prev2(_value-2);
  25.                 return  _prev1.value() + _prev2.value() + _prev1.foo() + _prev2.foo();
  26.         }
  27.  
  28.         int foo()
  29.         {
  30.                 int sum = 0;
  31.                 for(int i=0; i<SIZE; i++)
  32.                         sum += _foo[i];
  33.                 return sum;
  34.         }
  35. };
  36.  
  37. int main()
  38. {
  39.         for(int i=0; i<10; i++)
  40.         {
  41.                 FibObj2 x(33);
  42.                 printf("n=%d\n", x.value());
  43.         }
  44.         return 0;
  45. }


вроде все условия соблюдены, не?
 
Это сообщение редактировалось 21.09.2009 в 20:32
1 2 3 4 5

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru