On Mon, 18 Jul 2005, Ananda Kumar C wrote:

> Thanks a lot for your input. The performance has grown now, but I have an
> interesting observation.
> I had run my tests against both the 0.60.3 and 0.60.2 versions. My test
> program randomly picks up a word from a really huge list of words (around
> 1.2 M words) and tests the words for correct spelling.
> If a word is misspelt, I get the suggestions. The sug-mode config is now
> set to ultra.I run this test until I get around 500 misspelt words.
> 
> The results are as follows :
> +--------------------------+-----------------+------------------+
> |                          | ver. 0.60.3     | ver. 0.60.2      |
> +--------------------------+-----------------+------------------+
> |Avg. time for checking    |    17 microsecs |    6 microsecs   |
> |Avg. time for suggesting  |  2087 microsecs | 1029 microsecs   |
> +--------------------------+-----------------+------------------+

Those are not the results I am getting:

ver. 0.60.2:
  check avg: 13
  sug avg: 4861

ver. 0.60.3:
  check avg: 13
  sug avg: 3884

I modified your program a bit to print the average at the end.  Attached 
is a modified copy.

I don't know why you are getting worse results with Aspell 0.60.3.  You 
should't.

I am using Gcc 3.2.2  20030222 (Red Hat Linux 3.2.2-5)



#include <aspell.h>
#include <iostream>
#include <string>
#include <vector>
#include <unistd.h>
#include <sys/time.h>
#include <fstream.h>

using namespace std;

enum TimerAction { TIMER_ACTION_START, TIMER_ACTION_END };

#define TIMER_START() Timer(TIMER_ACTION_START)
#define TIMER_END(x,var) do {\
        int t = Timer(TIMER_ACTION_END);\
        cout << "Time taken for " << x << " : " << t << " us." << endl;\
        var.total += t;\
        var.count++;\
} while (false)

int Timer(TimerAction action)
{
        static struct timeval begin;
        struct timeval end;
        long retval;

        if (action == TIMER_ACTION_START)
        {
                retval = gettimeofday(&begin, NULL);
        }
        else
        {
                gettimeofday(&end, NULL);
                retval = (end.tv_sec-begin.tv_sec)*1000*1000 + 
(end.tv_usec-begin.tv_usec);
        }

        return retval; /* No. of microseconds since timer was started */
}

struct Stat {
        int total;
        int count;
};


int main()
{
        Stat other = {0,0};
        Stat check = {0,0};
        Stat sug = {0,0};

        /* New config object */
        AspellConfig *spell_config = new_aspell_config();

        /* Set conf */
        aspell_config_replace(spell_config, "lang", "en_US");
        aspell_config_replace(spell_config, "sug-mode", "ultra");

        /* New speller object */
        AspellCanHaveError *possible_err = new_aspell_speller(spell_config);

        AspellSpeller *spell_checker = NULL;
        if (aspell_error_number(possible_err) != 0) {
                cout << "ASPELL Error : " << aspell_error_message(possible_err) 
<< endl;
                return 1;
        }
        else {
                spell_checker = to_aspell_speller(possible_err);
        }

        /* Load the word list from the file */
        ifstream wordStream("/home/kevina/aspell-time/spell/words.lst"); 
        if (wordStream.is_open() == false) {
                cout << "Word list cannot be opened" << endl;
                return 2;
        }
        string aWord;
        vector<string> wordList;
        while (wordStream.eof() == false) {
                wordStream >> aWord;
                if (wordStream.eof() == false) {
                        wordList.push_back(aWord);
                }
        }
        wordStream.close();

        int iteration = 1;      
        do {
                char input[80];
                int randIndex = random() % wordList.size();
                aWord = wordList[randIndex];
                strcpy(input, aWord.c_str());
                int isCorrect;
                
                /* Check if the word is correct */
                TIMER_START();
                isCorrect = aspell_speller_check(spell_checker, input, -1); 
                TIMER_END("checking a word for correct spelling", check);
        
                if (isCorrect == 0) {
                        /* Inc(Iteration) if word is misspelt */
                        iteration++;
                        cout << "\"" << input << "\"" << " is misspelled." << 
endl;
                        
                        /* Get the suggestion for a misspelt word */
                        TIMER_START();
                        const AspellWordList *suggestions = 
aspell_speller_suggest(spell_checker, input, -1); 
                        TIMER_END("getting a list of suggestions from aspell", 
sug);

                        AspellStringEnumeration *elements = 
aspell_word_list_elements(suggestions); 
                        const char *aSuggestion;
                        int i = 1;

                        while ((aSuggestion = 
aspell_string_enumeration_next(elements)) != NULL) {
                                if (i == 1) {
                                        cout << "Suggestions :-" << endl;
                                        cout << "------------  " << endl;
                                }
                                cout << i++ << ". " << aSuggestion << endl;
                        }

                        delete_aspell_string_enumeration(elements); 
                }
                else {
                        cout << "\"" << input << "\"" << " is correctly 
spelled." << endl;
                }
                cout << "WORD LENGTH : " << strlen(input) << endl;
        } while (iteration <= 500);
        
        /* Delete the object before quitting */
        delete_aspell_config(spell_config);
        delete_aspell_speller(spell_checker);

        cout << "check avg: " << check.total/check.count << endl;
        cout << "sug avg: " << sug.total/sug.count << endl;

        return 0;
}


_______________________________________________
Aspell-user mailing list
Aspell-user@gnu.org
http://lists.gnu.org/mailman/listinfo/aspell-user

Reply via email to