• R/O
  • SSH
  • HTTPS

adp: Commit


Commit MetaInfo

Revisión305 (tree)
Tiempo2012-06-08 12:41:50
Autorohfuji

Log Message

またパフォーマンスが下がったのでいったん戻し、ExecContextのリサイクルを入れた。

Cambiar Resumen

Diferencia incremental

--- trunk/adp_execute_factory.cpp (revision 304)
+++ trunk/adp_execute_factory.cpp (revision 305)
@@ -125,8 +125,6 @@
125125 ExecContext_Factory newExecContext_Times( newExecContext_Times_Function);
126126 ExecContextRoot *newExecContext_Cut_Function(ExecContext *p_, void *f_, const PPredicate *pred_, VLocal *l) { return new ExecContext_Cut( p_, f_, pred_, l); }
127127 ExecContext_Factory newExecContext_Cut( newExecContext_Cut_Function);
128-ExecContextRoot *newExecContext_CutFail_Function(ExecContext *p_, void *f_, const PPredicate *pred_, VLocal *l) { return new ExecContext_CutFail( p_, f_, pred_, l); }
129-ExecContext_Factory newExecContext_CutFail( newExecContext_CutFail_Function);
130128
131129 ExecContextRoot *newExecContext_Fail_Function(ExecContext *p_, void *f_, const PPredicate *pred_, VLocal *l) { return new ExecContext_Fail( p_, f_, pred_, l); }
132130 ExecContext_Factory newExecContext_Fail( newExecContext_Fail_Function);
@@ -495,7 +493,6 @@
495493 factory_map.insert(ExecContext_Factory_Pair( string("counter"), &newExecContext_Counter));
496494 factory_map.insert(ExecContext_Factory_Pair( string("times"), &newExecContext_Times));
497495 factory_map.insert(ExecContext_Factory_Pair( string("!"), &newExecContext_Cut));
498- factory_map.insert(ExecContext_Factory_Pair( string("!fail"), &newExecContext_CutFail));
499496 factory_map.insert(ExecContext_Factory_Pair( string("fail"), &newExecContext_Fail));
500497 factory_map.insert(ExecContext_Factory_Pair( string("raise"), &newExecContext_Raise));
501498 factory_map.insert(ExecContext_Factory_Pair( string("next"), &newExecContext_Next));
--- trunk/adp_execute.h (revision 304)
+++ trunk/adp_execute.h (revision 305)
@@ -567,7 +567,7 @@
567567 horn = 0;
568568 goal = 0;
569569 hl = &hlocal; // ローカル変数エリア
570- afterunify.reserve(pred->size());
570+ // ecs,afterunifyのreserveはfirst,backtrackで行う
571571 horns = 0;
572572 skipnamechk = false;
573573 hornidx = 0;
@@ -576,6 +576,7 @@
576576 nextidx = (size_t)-1;
577577 pipe = 0;
578578 trueflg = false;
579+ afterunify.reserve(pred->size());
579580 nobacktrack = false;
580581 last_result = false;
581582 };
@@ -590,7 +591,6 @@
590591 ExecContextBase::backup = *gl; // ややこしいがCut述語使用時の整合性を取る為ここでバッグアップを取得しておく
591592 ecs.assign(goal->size(), 0);
592593 afterunify.reserve(vcnt);
593- afterunify.clear();
594594 horns = 0;
595595 skipnamechk = false;
596596 hornidx = 0;
@@ -703,6 +703,7 @@
703703
704704 struct ExecContext_Cut : public ExecContextRoot {
705705 ExecContext_Cut(ExecContext *p_, void *f_, const PPredicate *pred_, VLocal *l) : ExecContextRoot(p_, f_, pred_, l) { delflg = false; }
706+
706707 virtual void recreate(const PPredicate *pred_, VLocal *l) { ExecContextRoot::init(pred_, l); delflg = false; }
707708 virtual void recreate(ExecContext *p_, void *f_, const PPredicate *pred_, VLocal *l) { ExecContextRoot::init(p_,f,pred_, l); delflg = false; }
708709 virtual void reinit(const PPredicate *pred_, VLocal *l) { ExecContextRoot::init(pred_, l); delflg = false; }
@@ -743,7 +744,6 @@
743744 }
744745 }
745746
746- // 親の評価コンテクストを削除する
747747 for ( size_t i = 0; i < p->goalidx; i++ ) {
748748 ExecContextRoot *e = p->ecs[i];
749749 if ( e ) {
@@ -763,15 +763,6 @@
763763 }
764764 };
765765
766-struct ExecContext_CutFail : public ExecContext_Cut {
767- ExecContext_CutFail(ExecContext *p_, void *f_, const PPredicate *pred_, VLocal *l) : ExecContext_Cut(p_, f_, pred_, l) {}
768- virtual bool first(PException &excp) {
769- ExecContext_Cut::first(excp);
770- p->nobacktrack = true;
771- return false;
772- }
773-};
774-
775766 struct ExecContext_Fail : public ExecContextRoot {
776767 ExecContext_Fail(ExecContext *p_, void *f_, const PPredicate *pred_, VLocal *l) : ExecContextRoot(p_, f_, pred_, l) {}
777768 virtual bool first(PException &excp) {
--- trunk/adp.cpp (revision 304)
+++ trunk/adp.cpp (revision 305)
@@ -23,12 +23,12 @@
2323
2424 // 定数
2525 #ifdef ___X64____
26-#define VERSION_TEXT "ADP Ver 0.82.0304 X64 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n"
26+#define VERSION_TEXT "ADP Ver 0.82.0301 X64 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n"
2727 #else
2828 #if _WIN32
29-#define VERSION_TEXT "ADP Ver 0.82.0304 x86 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n"
29+#define VERSION_TEXT "ADP Ver 0.82.0301 x86 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n"
3030 #else
31-#define VERSION_TEXT "ADP Ver 0.82.0304 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n"
31+#define VERSION_TEXT "ADP Ver 0.82.0301 (http://www.adp.la/)\nCopyright (C) 2010-2012 Katsuhisa Ohfuji. This progman is distributed under GPL.\n"
3232 #endif
3333 #endif
3434
--- trunk/adp_compile.cpp (revision 304)
+++ trunk/adp_compile.cpp (revision 305)
@@ -939,49 +939,30 @@
939939 if ( *c == ';' ) c.next(); // skip ;
940940 // バックトラックの最適化
941941 if ( !body.empty() ) {
942- PPredicate *p = dynamic_cast<PPredicate *>(const_cast<PObject*>(body.back()));
942+ const PPredicate *p = dynamic_cast<const PPredicate *>(body.back());
943943 // 最後のカットは取り除く(first/backtrackメソッドで頑張る)
944944 if ( p != 0 ) {
945945 if ( p->ncmp("!") ) {
946946 body.pop_back();
947947 nobacktrack = true;
948- Array<PPredicate *>::iterator f = find( c.cut.begin(), c.cut.end(), p);
949- if ( f != c.cut.end() ) {
950- c.cut.erase(f);
948+ if ( c.cut.size() == 1 ) {
949+ c.cut.clear();
951950 }
952951 }
953-
954- // 最後がfalseでその前が!なら !fail に置き換える
955- if ( body.size() >= 2 && p->ncmp("fail") ) {
956- PPredicate *pp = dynamic_cast<PPredicate *>(const_cast<PObject*>(body[body.size()-2]));
957- if ( pp != 0 && pp->ncmp("!") ) {
958- PString *n = dynamic_cast<PString*>(const_cast<PObject*>(pp->name));
959- if ( n ) {
960- n->value = "!fail";
961- body.pop_back();
962- Array<PPredicate *>::iterator f = find( c.cut.begin(), c.cut.end(), pp);
963- if ( f != c.cut.end() ) {
964- c.cut.erase(f);
965- }
966- }
967- }
968- }
969952 }
970-
971953 // 途中のカットに関しては引数に保存する変数を入れる
972- if ( !c.cut.empty() ) {
973- for ( size_t i = 0; i < c.vstat.size(); i++ ) {
974- if ( c.vstat[i] == 3 ) {
975- PVeriable *v = get_gc()->factory.createObject<PVeriable>();
976- v->makeVeriable(c, c.vary[i], false );
977- // カットが複数ある場合、本来ならそのカットの位置に対して保存する変数を決定すべきだが
978- // そんなにカットを使う機会も考えられないのでカット1つを想定して最適化している
979- for ( size_t j = 0; j < c.cut.size(); j++ ) {
980- c.cut[j]->addMethodArg(c,0,v);
981- }
954+ for ( size_t i = 0; i < c.vstat.size(); i++ ) {
955+ if ( c.vstat[i] == 3 ) {
956+ PVeriable *v = get_gc()->factory.createObject<PVeriable>();
957+ v->makeVeriable(c, c.vary[i], false );
958+ // カットが複数ある場合、本来ならそのカットの位置に対して保存する変数を決定すべきだが
959+ // そんなにカットを使う機会も考えられないのでカット1つを想定して最適化している
960+ for ( size_t j = 0; j < c.cut.size(); j++ ) {
961+ c.cut[j]->addMethodArg(c,0,v);
982962 }
983963 }
984964 }
965+
985966 }
986967 return this;
987968 }
Show on old repository browser