crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

7 страниц V  < 1 2 3 4 5 > »   
Ответить в данную темуНачать новую тему
> Реализация анализатора (парсера) формул времени выполнения
AntonTatu
  опции профиля:
сообщение 6.3.2009, 0:07
Сообщение #21


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 5.3.2009, 8:19) *
Цитата(AntonTatu @ 5.3.2009, 0:55) *
А что по скорости выполнения ? , вот что написано у М.Шлее:
рекомендую для начала по пробовать, и если на практике окажется неприемлемое быстродействие, тогда будешь искать другой вариант.

ну вобщем попробовал, если использовать QtScript получается оччень медлено, использовал следующий скрипт:
var x; 
function(j, num) {тело функции}


х - это массив значений посчитанный в С++ и переданный скрипту
engine.globalObject().setProperty("x", MyArray);
в теле функции в скрипте используются различные значения массива x[i][j],

я так понимаю что медленно потому что приходится скрипту передавать весь массив целиком (т.е. делать для него копию), а при использовании dll ки весь массив не копируется, а значение передается по ссылке, а может быть можно как то в скрипту указывать ссылку а не делать "копию" всех значений массива ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_BRE_*
сообщение 6.3.2009, 7:52
Сообщение #22





Гости








    


Цитата(AntonTatu @ 6.3.2009, 0:07) *
я так понимаю что медленно потому что приходится скрипту передавать весь массив целиком (т.е. делать для него копию), а при использовании dll ки весь массив не копируется, а значение передается по ссылке, а может быть можно как то в скрипту указывать ссылку а не делать "копию" всех значений массива ?

Самое простое сделать класс (еще проще (но не обязательно) если наследоваться от QObject), который будет управлять твоим массивом и обеспечить доступ к объекту этого класса из контекста скрипта.

class Array2D : public QObject
{
    Q_OBJECT
public:
    ....

public Q_SLOTS:
    int    at( int i, int j ) const;
    void  set( int i, int j, int value );
};

{
    Array2D *arr = new Array2D( 100, 100 );

    // Заполнили массив
    for( ... )
        for( ... )
             arr->set( i, j, ... );

}

// Предоставили в контекс script engine для объекта arr.
// Смотри в assistant по QScriptable и QSciptEngine


А дальше из скрипта можно доставать значения используя arr.at( i, j ).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 6.3.2009, 9:29
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Пример:

array2d.h
#ifndef __ARRAY2D
#define __ARRAY2D

#include <QObject>
#include <vector>

class Array2D : public QObject
{
        Q_OBJECT
public:
        Array2D( int dx, int dy );

public Q_SLOTS:
        char    at( int i, int j ) const;
        void    set( int i, int j, char val );

        inline  int             dx() const { return m_dx; }
        inline  int             dy() const { return m_dy; }

private:
        int             m_dx;
        int             m_dy;
        std::vector< std::vector<char> > *m_data;
};

#endif


array2d.cpp
#include "array2d.h"

Array2D::Array2D( int dx, int dy )
        : m_dx( dx ), m_dy( dy )
{
        m_data = new std::vector< std::vector<char> >( m_dx );
        for( int i = 0; i < m_dx; ++i )
                (*m_data)[ i ] = std::vector<char>( m_dy );
}

char Array2D::at( int i, int j ) const
{
        Q_ASSERT( i > 0 && i < m_dx );
        Q_ASSERT( j > 0 && j < m_dy );
        return (*m_data)[ i ][ j ];
}

void Array2D::set( int i, int j, char val )
{
        Q_ASSERT( i > 0 && i < m_dx );
        Q_ASSERT( j > 0 && j < m_dy );
        (*m_data)[ i ][ j ] = val;
}


main.cpp
#include <QApplication>         
#include <QScriptEngine>        
#include <QDebug>
#include "array2d.h"

const int arrDx = 5;
const int arrDy = 5;

void dump( const Array2D &arr )
{
        for( int i = 0; i < arr.dx(); ++i )
                for( int j = 0; j < arr.dy(); ++j )
                        qDebug( "item [%i, %i] = %i", i, j, arr.at( i, j ) );
}

int main( int argc, char *argv[] )
{
        QApplication app( argc, argv );

        Array2D arr( arrDx, arrDy );

        for( int i = 0; i < arr.dx(); ++i )
                for( int j = 0; j < arr.dy(); ++j )
                        arr.set( i, j, i + j );

        dump( arr );

        QScriptEngine se;
        se.globalObject().setProperty( "arr", se.newQObject( &arr ) );

        QScriptValue fun = se.evaluate( "function( i, j ) { print( i, j ); return arr.at( i, j ); }" );
        QScriptValueList args;
        args << QScriptValue( &se, 1 ) << QScriptValue( &se, 4 );
        QScriptValue y = fun.call( QScriptValue(), args );
        qDebug() << y.toNumber();

        return 0;
}


Высокой скорости вычисления от скриптов ожидать не стоит (от нативной она будет сильно отличаться).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 6.3.2009, 10:03
Сообщение #24


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(BRE @ 6.3.2009, 9:29) *
Пример:

array2d.h
#ifndef __ARRAY2D
#define __ARRAY2D

#include <QObject>
#include <vector>

class Array2D : public QObject
{
        Q_OBJECT
public:
        Array2D( int dx, int dy );
                ~Array2D();

public Q_SLOTS:
        char    at( int i, int j ) const;
        void    set( int i, int j, char val );

        inline  int             dx() const { return m_dx; }
        inline  int             dy() const { return m_dy; }

private:
        int             m_dx;
        int             m_dy;
        std::vector< std::vector<char> > *m_data;
};

#endif


array2d.cpp
#include "array2d.h"

Array2D::Array2D( int dx, int dy )
        : m_dx( dx ), m_dy( dy )
{
        m_data = new std::vector< std::vector<char> >( m_dx );
        for( int i = 0; i < m_dx; ++i )
                (*m_data)[ i ] = std::vector<char>( m_dy );
}

Array2D::~Array2D()
{
                delete m_data;
}

char Array2D::at( int i, int j ) const
{
        Q_ASSERT( i > 0 && i < m_dx );
        Q_ASSERT( j > 0 && j < m_dy );
        return (*m_data)[ i ][ j ];
}

void Array2D::set( int i, int j, char val )
{
        Q_ASSERT( i > 0 && i < m_dx );
        Q_ASSERT( j > 0 && j < m_dy );
        (*m_data)[ i ][ j ] = val;
}


main.cpp
#include <QApplication>         
#include <QScriptEngine>        
#include <QDebug>
#include "array2d.h"

const int arrDx = 5;
const int arrDy = 5;

void dump( const Array2D &arr )
{
        for( int i = 0; i < arr.dx(); ++i )
                for( int j = 0; j < arr.dy(); ++j )
                        qDebug( "item [%i, %i] = %i", i, j, arr.at( i, j ) );
}

int main( int argc, char *argv[] )
{
        QApplication app( argc, argv );

        Array2D arr( arrDx, arrDy );

        for( int i = 0; i < arr.dx(); ++i )
                for( int j = 0; j < arr.dy(); ++j )
                        arr.set( i, j, i + j );

        dump( arr );

        QScriptEngine se;
        se.globalObject().setProperty( "arr", se.newQObject( &arr ) );

        QScriptValue fun = se.evaluate( "function( i, j ) { print( i, j ); return arr.at( i, j ); }" );
        QScriptValueList args;
        args << QScriptValue( &se, 1 ) << QScriptValue( &se, 4 );
        QScriptValue y = fun.call( QScriptValue(), args );
        qDebug() << y.toNumber();

        return 0;
}


Высокой скорости вычисления от скриптов ожидать не стоит (от нативной она будет сильно отличаться).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_AntonTatu_*_*
сообщение 6.3.2009, 12:11
Сообщение #25





Гости








    


Цитата
Высокой скорости вычисления от скриптов ожидать не стоит (от нативной она будет сильно отличаться).

спасибо, так то же попробывал..., очень медленно в 1000 раз на глазок если, вобщем вопрос не снят, каким образом можно из проги получать код и компилить его "нативно"....? я уже весь инет перелазил, ну не писать же собственный компилятор.... (для меня это не реально :) )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 6.3.2009, 12:26
Сообщение #26


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Гость_AntonTatu_* @ 6.3.2009, 12:11) *
спасибо, так то же попробывал..., очень медленно в 1000 раз на глазок если, вобщем вопрос не снят, каким образом можно из проги получать код и компилить его "нативно"....? я уже весь инет перелазил, ну не писать же собственный компилятор.... (для меня это не реально :) )

Уточни, из каких операций будет состоять формула (+ - * /)? Или будут еще какие-то функции?
Опиши подробней.
Ты используешь 2-мерный массив, это не изображение часом, а формула - не фильтр ли?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonTatu
  опции профиля:
сообщение 6.3.2009, 12:34
Сообщение #27


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(BRE @ 6.3.2009, 12:26) *
Цитата(Гость_AntonTatu_* @ 6.3.2009, 12:11) *
спасибо, так то же попробывал..., очень медленно в 1000 раз на глазок если, вобщем вопрос не снят, каким образом можно из проги получать код и компилить его "нативно"....? я уже весь инет перелазил, ну не писать же собственный компилятор.... (для меня это не реально :) )

Уточни, из каких операций будет состоять формула (+ - * /)? Или будут еще какие-то функции?
Опиши подробней.
Ты используешь 2-мерный массив, это не изображение часом, а формула - не фильтр ли?


все намного про ще, генерится специальным образом массив, считается формула такого вида:
x[0,j]*x[2,j]*x[5,j]*x[10,j]+x[0,j]*x[3,j]*x[4,j]+N+.....
формула считается в цикле, с каждой итерацией формула новая, ее длинна то же может изменится..., переменные в формуле это значения разных ячеек массива, на выходе каждой итерации необходимо получить расчетное значение итой формулы, колличество прогонов (итераций) миллионы.... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 6.3.2009, 12:39
Сообщение #28


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AntonTatu @ 6.3.2009, 12:34) *
все намного про ще, генерится специальным образом массив, считается формула такого вида:
x[0,j]*x[2,j]*x[5,j]*x[10,j]+x[0,j]*x[3,j]*x[4,j]+N+.....
формула считается в цикле, с каждой итерацией формула новая, ее длинна то же может изменится..., переменные в формуле это значения разных ячеек массива, на выходе каждой итерации необходимо получить расчетное значение итой формулы, колличество прогонов (итераций) миллионы.... :)

Возможно ли выделить из формулы одинаковые части, например
x[0,j]*x[2,j]*x[5,j]*x[10,j]
x[0,j]*x[3,j]*x[4,j]
которые повторяются от формулы к формуле?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 6.3.2009, 16:34
Сообщение #29


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


Может быть ассемблер? :)
Данные то все числовые, компилятор небольшой :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 6.3.2009, 17:01
Сообщение #30


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Тогда можно глянуть на fasmlib.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

7 страниц V  < 1 2 3 4 5 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 3:48