Assasin писал(а): Во-первых, здесь как раз вариант "второй гораздо больше". Во-вторых, "стрельба" по точкам одинаковая для каждого тестируемого, следовательно, можно просто один раз ее вычислить и вычесть (результат от этого не сильно изменится, как была разница в разы, так и останется) Двойка, Вам, товарищ студент Во-первых: Ваше утверждение ничем не подтверждено. А мои измерения говорят о том, что оно не очень соответствует действительности. Мягко говоря. Во-вторых: "можно вычесть", и реально вычесть - есть разные вещи. Хотя бы потому, что перед тем, как "вычесть" - надо измерить вычитаемое. Внимание: сначала измерить, а уже потом уже говорить про "кто-кого гораздо больше". В третьих: "Разы" ли это, и сколько этих "разов" - вопрос интересный. И какие "разы" нас интересуют. Меня лично интересуют "разы для собственного времени". Не потому, что "интерфейсное время" меня устраивает, а потому, что в рамках работы над элементом, второе - это форсмажор (если по-русски - то хучь в ухо мочись), а первое как раз и определяет качество моей (твоей, его, и т.п.) работы. Зная соотношение этих времен, можно рассуждать о необходимости (или - нет) его улучшения. НО, обратите внимание -- ЗНАЯ. А не просто языком почесавши Вот, смотрите код. ЭКСПЕРИМЕНТ делается примерно так: Add(MainForm,2953706,42,42) { Width=361 Height=228 Position=1 } Add(MathParseEx,204878,385,133) { MathStr="(%1+%2)" Point(onError) link(X1,13913289:Var3,[(391,110)]) link(X2,7875420:Var2,[]) AddHint(47,12,55,13,MathStr) } Add(MathParse,1835425,322,329) { MathStr="(%1+%2)" link(X1,381117:Var2,[]) link(X2,12674061:Var1,[(335,117)]) AddHint(47,10,55,13,MathStr) } Add(Label,3837647,224,378) { Left=280 Top=60 Width=10 Height=17 Caption="0" } Add(Label,5514199,224,182) { Left=280 Top=20 Width=10 Height=17 Caption="0" } Add(Label,5684404,273,378) { Left=145 Top=60 Width=100 Height=17 Caption="MathParse: " } Add(Label,2750348,273,182) { Left=145 Top=20 Width=100 Height=17 Caption="MathParseEx:" } Add(Button,8742485,35,343) { Left=20 Top=15 Width=110 Caption="Test 01" link(onClick,8604457:doEvent1,[]) } Add(Hub,8604457,105,343) { OutCount=6 link(onEvent1,14100898:doStart,[(130,349)(130,181)]) link(onEvent2,14100898:doStop,[(137,356)(137,188)]) link(onEvent3,16096533:doStart,[(144,363)(144,279)]) link(onEvent4,16096533:doStop,[(151,370)(151,286)]) link(onEvent5,955542:doStart,[]) link(onEvent6,955542:doStop,[]) } Add(Edit,11617021,322,42) { Left=20 Top=45 Text="3.1" DataType=4 } Add(Edit,8004220,392,42) { Left=80 Top=45 Text="2.7" DataType=4 } Add(For,7769855,245,133) { End=1000 link(onEvent,204878:doCalc,[]) AddHint(-67,16,39,13,End) } Add(For,2646223,245,329) { End=1000 link(onEvent,1835425:doCalc,[]) AddHint(-66,14,39,13,End) } Add(TimeCounter,14100898,168,175) { Precision=1 link(onStart,7769855:doFor,[(207,181)(207,139)]) link(onStop,5514199:doText,[]) } Add(TimeCounter,955542,168,371) { Precision=1 link(onStart,2646223:doFor,[(207,377)(207,335)]) link(onStop,3837647:doText,[]) } Add(GetDataEx,381117,322,105) { link(Data,11617021:Text,[]) } Add(GetDataEx,7875420,392,112) { link(Data,8004220:Text,[]) } Add(MathParseEx,11208601,805,133) { DataCount=4 MathStr="(%1+%2) + 1/(%1+%2) + 1/(1+%1+%2) + 1/(2+%1+%2) + 1/(3+%1+%2) + 1/(4+%1+%2) + 1/(5+%1+%2) + 1/(6+%1+%2) + 1/(7+%1+%2) + 1/(8+%1+%2) + 1/(9+%1+%2)" Point(onError) link(X1,13986686:Var3,[(811,110)]) link(X2,9333203:Var2,[]) AddHint(48,5,196,65,MathStr) } Add(MathParse,9132160,742,329) { DataCount=4 MathStr="(%1+%2) + 1/(%1+%2) + 1/(1+%1+%2) + 1/(2+%1+%2) + 1/(3+%1+%2) + 1/(4+%1+%2) + 1/(5+%1+%2) + 1/(6+%1+%2) + 1/(7+%1+%2) + 1/(8+%1+%2) + 1/(9+%1+%2)" link(X1,4971951:Var2,[]) link(X2,10617285:Var1,[(755,117)]) AddHint(47,10,196,65,MathStr) } Add(Label,14667652,644,378) { Left=280 Top=135 Width=10 Height=17 Caption="0" } Add(Label,3186479,644,182) { Left=280 Top=95 Width=10 Height=17 Caption="0" } Add(Label,16084072,693,378) { Left=145 Top=135 Width=100 Height=17 Caption="MathParse: " } Add(Label,5159161,693,182) { Left=145 Top=95 Width=100 Height=17 Caption="MathParseEx:" } Add(Button,9927697,455,343) { Left=20 Top=90 Width=110 Caption="Test 10" link(onClick,635105:doEvent1,[]) } Add(Hub,635105,525,343) { OutCount=6 link(onEvent1,10011126:doStart,[(550,349)(550,181)]) link(onEvent2,10011126:doStop,[(557,356)(557,188)]) link(onEvent3,12618441:doStart,[(564,363)(564,279)]) link(onEvent4,12618441:doStop,[(571,370)(571,286)]) link(onEvent5,13392031:doStart,[]) link(onEvent6,13392031:doStop,[]) } Add(Edit,4457363,742,42) { Left=20 Top=120 Text="3.1" DataType=4 } Add(Edit,42559,812,42) { Left=80 Top=120 Text="2.7" DataType=4 } Add(For,16498081,665,133) { End=1000 link(onEvent,11208601:doCalc,[]) AddHint(-67,16,39,13,End) } Add(For,2675870,665,329) { End=1000 link(onEvent,9132160:doCalc,[]) AddHint(-66,14,39,13,End) } Add(TimeCounter,10011126,588,175) { Precision=1 link(onStart,16498081:doFor,[(627,181)(627,139)]) link(onStop,3186479:doText,[]) } Add(TimeCounter,13392031,588,371) { Precision=1 link(onStart,2675870:doFor,[(627,377)(627,335)]) link(onStop,14667652:doText,[]) } Add(GetDataEx,4971951,742,105) { link(Data,4457363:Text,[]) } Add(GetDataEx,9333203,812,112) { link(Data,42559:Text,[]) } Add(Label,4194723,224,280) { Left=280 Top=40 Width=10 Height=17 Caption="0" } Add(Label,3867639,273,280) { Left=145 Top=40 Width=100 Height=17 Caption="MathParseFast: " } Add(For,1517355,245,231) { End=1000 link(onEvent,11847314:doCalc,[]) AddHint(-66,14,39,13,End) } Add(TimeCounter,16096533,168,273) { Precision=1 link(onStart,1517355:doFor,[(207,279)(207,237)]) link(onStop,4194723:doText,[]) } Add(FastMathParse,11847314,350,231) { MathStr="(%1+%2)" link(X1,13913289:Var2,[]) link(X2,12674061:Var2,[]) AddHint(50,9,55,13,MathStr) } Add(GetDataEx,13913289,350,105) { Angle=3 link(Data,381117:Var3,[]) } Add(GetDataEx,12674061,357,112) { Angle=1 link(Data,7875420:Var1,[]) } Add(Label,9109861,644,280) { Left=280 Top=115 Width=10 Height=17 Caption="0" } Add(Label,9040181,693,280) { Left=145 Top=115 Width=100 Height=17 Caption="MathParseFast: " } Add(For,7160229,665,231) { End=1000 link(onEvent,12868420:doCalc,[]) AddHint(-66,14,39,13,End) } Add(TimeCounter,12618441,588,273) { Precision=1 link(onStart,7160229:doFor,[(627,279)(627,237)]) link(onStop,9109861:doText,[]) } Add(FastMathParse,12868420,770,231) { MathStr="(%1+%2) + 1/(%1+%2) + 1/(1+%1+%2) + 1/(2+%1+%2) + 1/(3+%1+%2) + 1/(4+%1+%2) + 1/(5+%1+%2) + 1/(6+%1+%2) + 1/(7+%1+%2) + 1/(8+%1+%2) + 1/(9+%1+%2)" link(X1,13986686:Var2,[]) link(X2,10617285:Var2,[]) AddHint(50,9,196,65,MathStr) } Add(GetDataEx,13986686,770,105) { Angle=3 link(Data,4971951:Var3,[]) } Add(GetDataEx,10617285,777,112) { Angle=1 link(Data,9333203:Var1,[]) }
Что важно: и в тесте 01, и в тесте 10 - одинаковое число интерфейсных манипуляций. Но очень разный объем вычислений. И вот только теперь можно попробовать "вычесть". И не ранее. Ну, и "кто кого гораздо больше" И никогда не парьте мне могзи про то, что Fast "в разы" быстрее там чего-то. Потому что в сотни разов
Короче, не побоюсь повториться, но: Эксперимент -- это Вам не баб щупать ------------ Дoбавленo в 14.21:Assasin писал(а): Это тогда надо строить дерево выражения, как я понимаю. Если подскажешь метод, как обойтись без него и не переделывать парсер снова, то можно добавить. Не надо ничего усложнять. Все уже есть, вообще-то говоря. Вычисления - есть в оригинальном (с которого разбор ты и срисовывал) Кодирование - ты уже написал. Надо просто их "скрестить". Ну типа: результатом работы LevelXXX является либо КОД (уже записанный в TProgram), либо вычисленная КОНСТАНТА. ((как об этом догадается вызывающий - ну придумаем чего ни то...)) Если (к примеру) ты складываешь две константы - то возвращаешь результат этого сложения вызывающему, и обзываешь его КОНСТАНТОЙ. Если один из операндов переменная - генерируешь соответствующий КОД. Но подробности -- чуток по-позже... Ничего военного, в общем
|