Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Длина чисел 
:(
    Опции темы
W4FhLF
Дата 13.5.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Ln78, спасибо, что подняли такую интересную тему smile 

У меня результаты таковы:

10000000:
LenOfInt1 - 218
LenOfInt2 - 719
LenOfInt3 - 290
LenOfInt4 - 170
LenOfInt5 - 67

1000000000:
LenOfInt1 - 22130
LenOfInt2 - 74718
LenOfInt3 - 35719
LenOfInt4 - 18029
LenOfInt5 - 7046

Но делать маленькие замеры с помощью GetTickCount неккоректно, поэтому для дальнейших тестов я решил выбрать число наибольшей разрядности, способное поместиться в DWORD - 1000000000. 

Main: 
Код

int main(int argc, char* argv[])
{
   int n,N=1000000000;
   int l=0;
   DWORD dwStart = GetTickCount();
   cout << LenOfInt6(10);
   for( n = 1; n < N; n++ )
      l+= LenOfInt6( n );
   DWORD dwEnd =GetTickCount();
   cout << "l=" << l << ";  Time=" << dwEnd - dwStart << endl;

    getche();
    return 0;
}


Из числа приведённых Вами самая быстрая LenOfInt5, но это не предел, взяв за основу LenOfInt5 получил такое вот:

Код

DWORD LenOfInt6 (DWORD n) 
{
    DWORD r = 0;
    __asm {
    mov eax,n
    mov ebx,10
    cmp eax,1000000000
    sbb ebx,0
    cmp eax,100000000
    sbb ebx,0
    cmp eax,10000000
    sbb ebx,0
    cmp eax,1000000
    jnc next
    sbb ebx,0
    cmp eax,100000
    sbb ebx,0
    cmp eax,10000
    sbb ebx,0
    cmp eax,1000
    sbb ebx,0
    cmp eax,100
    sbb ebx,0
    cmp eax,10
    sbb ebx,0
    next:
    mov r,ebx
    };
    return r;
}


Результат на 1000000000 - 3600.

Думаю не предел smile

PS Athlon 3500+ AM2

Добавлено @ 17:51
Идём дальше smile

Код

DWORD LenOfInt6 (DWORD n) 
{
    __asm {
    mov eax,n
    mov ebx,10
    cmp eax,1000000000
    sbb ebx,0
    cmp eax,100000000
    sbb ebx,0
    cmp eax,10000000
    sbb ebx,0
    cmp eax,1000000
    jnc next
    sbb ebx,0
    cmp eax,100000
    sbb ebx,0
    cmp eax,10000
    sbb ebx,0
    cmp eax,1000
    sbb ebx,0
    cmp eax,100
    sbb ebx,0
    cmp eax,10
    sbb ebx,0
    next:
    mov eax,ebx
    };
    return;
}


3400мс.

Добавлено через 10 минут и 51 секунду
advanced version smile

Код

DWORD LenOfInt8 (DWORD n) 
{
    __asm {
    mov eax,n
    mov ebx,10
    cmp eax,1000000000
    sbb ebx,0
    cmp eax,100000000
    jnc next
    sbb ebx,0
    cmp eax,10000000
    sbb ebx,0
    cmp eax,1000000
    sbb ebx,0
    cmp eax,100000
    jnc next
    sbb ebx,0
    cmp eax,10000
    sbb ebx,0
    cmp eax,1000
    sbb ebx,0
    cmp eax,100
    sbb ebx,0
    cmp eax,10
    sbb ebx,0
    next:
    mov eax,ebx
    };
    return;
}


2601мс. на 1000000000

Это сообщение отредактировал(а) W4FhLF - 13.5.2007, 17:52


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Ln78
Дата 13.5.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



W4FhLF, я в ассемблере, особенно при работе с сопроцессором, не силён, поэтому для меня остались непонятными 2 вопроса: почему у меня результаты по первой функции так разительно  отличаются по быстродействию и, что ещё хуже, по значению, причём последнее совсем непонятно. Так, если я перед циклом ставлю
cout << LenOfInt1(9);
а сам цикл считаю от 1 до 8, получаю, хоть и неправильный но «не сильно» ответ 11. А если строку с выводом комментирую (она, кстати, тоже выводит неправильный результат, равный 2), то получаю вообще -2147483636. Функцию я просто скопировал, непонятно, то ли в ней что-то не так, то ли где-то ещё. Среда – VS2005, процессор Intel Pentium-4, 3GHz. В чём может быть причина?

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0706 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.