Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Линейный список быстрее массива?

21K
23 октября 2006 года
Ржавый Дятел
2 / / 23.10.2006
Из следующих двух прог, первая работает значительно быстрее.
Вопрос, почему? Лин. список быстрее массива? Но в первой проге есть вывод в файл и вызовы функций. Вторая - написана просто по-идиотски, под конкретный случай.

Объясню теперь, что должна делать прога. Прога должна создавать словарь для брутфорсера. Букв в слове - 8. Алфавит:
"0123456789abcdefghijklmnopqrstuvwxyz"

[SIZE="4"]Листинг. Прога первая(быстрая):[/SIZE]

[SIZE="3"]stdafx.h[/SIZE]
Код:
#pragma once

#define WIN32_LEAN_AND_MEAN    
#include <stdio.h>
#include <tchar.h>
#include <atlstr.h>


struct periods//структура односвязного для хватания алфавита
{
    short start,end;
    periods *next;
};

struct StructWord//структура двусвязного для подбираемого слова
{
    char c;
    StructWord *next;
    StructWord *prev;
};

class DictWord//двусвязный подбираемое слово
{
public:
    DictWord(short n, CString DictChar);//длинна в буквах и алфавит
    ~DictWord();
    int Add();//следующее слово -2 - выходное значение
    CString GetString(bool Heading);//получить слово
private:
    StructWord SWord;
    StructWord *Current;
    StructWord *Head;
    StructWord *Tale;

    CString CharBase;
    int CharBaseLength;
    bool PureAdd;
};

class DictCreator//создатель словаря
{
public:
    DictCreator(periods* range);//задание алфавита
    bool Open(const char* DictName);//открытия файла
    void Close();
    void Work(int n, int nn);// делать слова от n до nn символов
private:
    FILE* DictFile;
    char BaseDict[255];//базовый набор АСКИИ
    CString Dict;
};



[SIZE="3"]stdafx.cpp[/SIZE]
Код:
#include "stdafx.h"



DictWord::DictWord(short n, CString DictChar)
{
    const char ZeroChar=DictChar.GetAt(0);
    Current= new StructWord;
    Head=Current; Tale=Current;
    Current->c=ZeroChar;

    for(int i=1;i<n;i++)
    {
        Current->next= new StructWord;
        Current->next->c=ZeroChar;
        Current->next->prev=Current; Tale=Current->next;
        Current=Current->next;     
    }
   
    CharBase=DictChar;
}

DictWord::~DictWord()
{
    while(Current!=Head)
    {
        Current=Tale;
        Current=Current->prev;
        Tale=Current;
        delete Current->next;
    }
    delete Tale;
    delete Head;

}

CString DictWord::GetString(bool Heading)
{
    CString TempString="";
    if(Heading)
    {
        Current=Tale;
        while (true)
        {
            TempString+=Current->c;
            if(Current==Head) break;
            Current=Current->prev;
           
        }
    }
    else
    {
        Current=Head;
        while(true)
        {
            TempString+=Current->c;
            if(Current==Tale) break;
            Current=Current->next;         
        }
    }
    return TempString;
}

int DictWord::Add()
{
    int Now;
    bool E=true;
   
    char Max=CharBase.GetAt(CharBase.GetLength()-1);
    char Min=CharBase.GetAt(0);

    if(PureAdd)Current=Tale;
    Now=CharBase.Find(Current->c,0);   
    Now++; 
   
    if((Now>=CharBase.GetLength())||(Now<0))
    {
        Current->c=Min;
        if(Current!=Head)
        {
            Current=Current->prev;
            PureAdd=false;
            if(-2==Add()) return -2;
            return -1;
        }
        else
            return -2;     
    }
    else
    {
        Current->c=CharBase.GetAt(Now);
        PureAdd=true;
        return Now;
    }
}


DictCreator::DictCreator(periods* range)
{
    periods *run;
    int ii=0;  
   
    for(int i=0;i<=255;i++)
        BaseDict=i;

    run=range;
    while(run!=NULL)
    {      
        for(int i=run->start;i<=run->end;i++)
        {
            Dict+=char(BaseDict);
            ii++;
        }
        run=run->next;
    }  
}

bool DictCreator::Open(const char* DictName)
{  
    if(DictName!=NULL)
        DictFile=fopen(DictName,"w+t");
    if(DictFile!=NULL) return true;
    else return false; 
}

void DictCreator::Close()
{
    if(DictFile!=NULL) fclose(DictFile);
}


void DictCreator::Work(int n, int nn)
{
    int a;
    DictWord *DCW; 
   
    for(int i=n;i<=nn;i++)
    {
        a=0;
        DCW = new DictWord(i, Dict);
        while(a!=-2)
        {      
            fprintf(DictFile,"%s \n",DCW->GetString(false));
            printf("%s \n",DCW->GetString(false));
            a=DCW->Add();
        }      
        free(DCW);
    }  
}


[SIZE="3"]void main()...[/SIZE]
Код:
#include "stdafx.h";
int _tmain(int argc, _TCHAR* argv[])
{
    periods r;
    r.start=48; r.end=57;
    r.next= new periods;
    r.next->start=97; r.next->end=122;
    r.next->next=NULL; 


    DictCreator* MyDict;
    MyDict= new DictCreator(&r);
    MyDict->Open("README.txt");
    MyDict->Work(8,8); 
    MyDict->Close();
    return 0;
}


[SIZE="4"]Прога вторая(кривая и тормозная):[/SIZE]

[SIZE="3"]void main()...[/SIZE]

Код:
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    short i=0; 
   
    const char Table[36]=
    {
        '0','1','2','3','4','5','6','7','8','9',
        'a','b','c','d','e','f','g','h','i','j',
        'k','l','m','n','o','p','q','r','s','t',
        'u','v','w','x','y','z'        
    };

    short PasswordCount[8]=
    {
        0,0,0,0,0,0,0,0
    };

    while(true)
    {
        if(false)
        {
            i++;
next:
            PasswordCount++;           
            if(PasswordCount==36)
            {
                PasswordCount=0;
                i++;
                if(i==8)
                    break;
                else
                    goto next;
            }          
            i=0;
        }      
        PasswordCount++;
       
        if(PasswordCount==36)
        {
            PasswordCount=0;
            i++;
            goto next;
        }
        printf("%c %c %c %c %c %c %c %c \n",Table[PasswordCount[7]],Table[PasswordCount[6]],Table[PasswordCount[5]],Table[PasswordCount[4]],Table[PasswordCount[3]],Table[PasswordCount[2]],Table[PasswordCount[1]],Table[PasswordCount[0]]);
    }  
    return 0;
}
398
24 октября 2006 года
Alexandoros
630 / / 21.10.2005
А эта еще быстрее.

int _tmain(int argc, _TCHAR* argv[])
{
char i1, i2, i3, i4, i5, i6, i7, i8;

FILE* DictFile = fopen("hi.txt","w+t");

const char Table[]=
{
'0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j',
'k','l','m','n','o','p','q','r','s','t',
'u','v','w','x','y','z'
};
char TabSz = sizeof(Table) / sizeof(char);
char Password[9] = {'0', '0', '0', '0',
'0', '0', '0', '0', 0};


for(i1 = 0; i1 < TabSz; ++i1)
{
Password[0] = Table[i1];
for(i2 = 0; i2 < TabSz; ++i2)
{
Password[1] = Table[i2];
for(i3 = 0; i3 < TabSz; ++i3)
{
Password[2] = Table[i1];
for(i4 = 0; i4 < TabSz; ++i4)
{
Password[3] = Table[i4];
for(i5 = 0; i5 < TabSz; ++i5)
{
Password[4] = Table[i5];
for(i6 = 0; i6 < TabSz; ++i6)
{
Password[5] = Table[i6];
for(i7 = 0; i7 < TabSz; ++i7)
{
Password[6] = Table[i7];
for(i8 = 0; i8 < TabSz; ++i8)
{
Password[7] = Table[i8];
printf("%s\n", Password);
fprintf(DictFile, "%s\n", Password);

}

}

}

}

}

}

}
}

fclose(DictFile);

return 0;


}//int _tmain(int argc, _TCHAR* argv[])
21K
24 октября 2006 года
Ржавый Дятел
2 / / 23.10.2006
Странно, у меня не быстрее. Одинаково работает примерно. Зато памяти жрёт поменьше.
А из-за чего моя вторая тормозит я правильно понял, что из-за i?
Лишние операции возникают...
398
24 октября 2006 года
Alexandoros
630 / / 21.10.2005
Скорее всего тормозит из-за этого
printf("%c %c %c %c %c %c %c %c \n",Table[PasswordCount[7]],Table[PasswordCount[6]],Table[PasswordCount[5]],Table[PasswordCount[4]],Table[PasswordCount[3]],Table[PasswordCount[2]],Table[PasswordCount[1]],Table[PasswordCount[0]]);


--Странно, у меня не быстрее

У меня на обработку
00001000-
00004000

Первая твоя -16сек, моя - 13сек.
3
26 октября 2006 года
Green
4.8K / / 20.01.2000
А как профилируете?
398
26 октября 2006 года
Alexandoros
630 / / 21.10.2005
[QUOTE=Green]А как профилируете?[/QUOTE]

Силой моска :):):):)
Я ж сказал "скорее всего".
3
26 октября 2006 года
Green
4.8K / / 20.01.2000
Ваш моск дает не полную информацию, воспользуйтесь профайлером.
398
27 октября 2006 года
Alexandoros
630 / / 21.10.2005
>>Ваш моск дает не полную информацию
Не факт

>>воспользуйтесь профайлером.
А зачем?
3
27 октября 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=Alexandoros]>>Ваш моск дает не полную информацию
Не факт
[/QUOTE]
Привык работать "на глазок"? :)

[QUOTE=Alexandoros]
>>воспользуйтесь профайлером.
А зачем?[/QUOTE]
Чтобы получить реальную картину производительности и узкие места в ней, а не разводить кустарщину.
398
27 октября 2006 года
Alexandoros
630 / / 21.10.2005
[QUOTE=Green]
Чтобы получить реальную картину производительности и узкие места в ней, а не разводить кустарщину.[/QUOTE]
Я неправильно выразился.
"Мне зачем?" :)
63
04 ноября 2006 года
Zorkus
2.6K / / 04.11.2006
[QUOTE=Green]Привык работать "на глазок"? :)


Чтобы получить реальную картину производительности и узкие места в ней, а не разводить кустарщину.[/QUOTE]

Вот это в рамочку и на стенку. Имхо, писать без профайлинга что то серьезное, особенно системное - это бредовая самоуверенность.
Помню, как я однажды пробовал реализовать перехват API :D на глазок...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог