//+------------------------------------------------------------------+//| CharArrayToString и StringToCharArray.mq4 |//| Peter Konow |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Peter Konow"#property link"https://www.mql5.com"#property version"1.00"//--------------------------------------------//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---string qwerty = "qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj";
uchar Arr[];
//---------------------------------//Создаем объект связи.//---------------------------------ObjectCreate(0,"button_1",OBJ_BUTTON,0,0,0);
//---------------------------------ulong t1 = GetMicrosecondCount();
//---------------------------------//Переводим строку в тип Char//---------------------------------StringToCharArray(qwerty,Arr,0,WHOLE_ARRAY);
//---------------------------------ulong t2 = GetMicrosecondCount();
//---------------------------------//Переводим массив Char обратно в строку://---------------------------------string str_1 = CharArrayToString(Arr,0,WHOLE_ARRAY);
//---------------------------------ulong t3 = GetMicrosecondCount();
//---------------------------------//Записываем строку в описании МТ-объекта.//---------------------------------ObjectSetString(0,"button_1",OBJPROP_TEXT,"qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj");
ulong t4 = GetMicrosecondCount();
//---------------------------------//Cчитываем строку из описания МТ-объекта.//---------------------------------string str_2 = ObjectGetString(0,"button_1",OBJPROP_TEXT);
ulong t5 = GetMicrosecondCount();
//--------------------------------- //Замеряем время исполнения.//----------------------------------------------Print("Time of execution StringToCharArray: ",t2-t1);
Print("Time of execution CharArrayToString: ",t3-t2," строка от CharArrayToString: ",str_1);
//----------------------------------------------Print("Time of execution ObjectSetString: ",t4-t3);
Print("Time of execution ObjectGetString: ",t5-t4," строка от ObjectGetString: ",str_2);
//----------------------------------------------
}
//+------------------------------------------------------------------+
结果。
2018.12.1816:44:20.042CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution StringToCharArray: 472018.12.1816:44:20.042CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution CharArrayToString: 35 строка от CharArrayToString: qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj
2018.12.1816:44:20.042CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution ObjectSetString: 32018.12.1816:44:20.042CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution ObjectGetString: 3 строка от ObjectGetString: qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj
谈及直觉。我想给你一个有趣的例子。我的帖子,印在这个主题https://www.mql5.com/ru/forum/95632/page12两年多以前。
1.图形引擎的概念。
2.图形核心的概念。
3.为MT平台创建视觉工作室的阶段。
4.EA接口创建机制的描述。
图形引擎是一个设计为指示器的程序。这个程序只为管理用户界面而设计。它执行一套基本功能。
图形引擎像其他指标一样被添加到图表 中。它包括以下一组窗口。
原则上,这就是图形引擎概念的终结。重要的是,没有它就不可能进行接口操作。
图形引擎是一个包含界面中所有对象和窗口数据的信息块,它被记录在一个数组中并保存在一个文件中。
该块是图形界面的数字表示。它是由图形引擎根据用户的要求加载的。 图形引擎本身有自己的内部图形内核,确保其自身窗口的运行,并在该内核内提供自由空间,以便将用户界面(以数字形式)整合到其中。集成是在从文件中加载图形核心的过程中进行的。
3.在MT平台上创建一个视觉工作室,据我所知,分为两个阶段。
4.我想概述一下界面创建过程的机制,并稍微揭开其技术的面纱。解释一下通过文件创建界面的便利性从何而来。
情况就是这样:引擎有一个特殊的功能,可以根据一个文件创建一个完整的图形内核,并将加载信息量降到最低 。这个文件中的启动信息是不言自明的,而且是人类可读的。它很容易编写和编辑。例 如,你需要写"_CREATE_NEW_WINDOW " 来创建一个窗口, 以及"_CHECKBOX "和 复选框的名称,(引擎会自动识别元素的名称,作为元素本身的名称和其参数的名称)。
这个函数被称为 "G_CORE_BUILDER()", 它通过从两个主要来源获取数据来构建图形核心:一个由用户创建的启动文件和 "CONTENT[]" 数组,其中包含了所有包含在窗口和控件平台中的标准对象组。"CONTENT[]" 也包含对象的状态和脚本。一切都在一个阵列中。一般来说,来自 "CONTENT[]"的源材料+用户创建的加载器文件被 "G_CORE_BUILDER() "用来构建引擎工作的图形核心。
令人惊讶的是,在两年的努力工作中,这些术语和概念并没有改变。而函数、数组和关键字就像这里说的那样。一切都按照这个方案来实施。尽管两年前,我根本没有开发标记语言的经验,但这项技术正在发挥作用并不断发展。
我没有走到死胡同,我没有改变概念,我没有改变方向。我继续创建引擎、核心和标记语言,完全按照我最初的意图。而实践证实了我选择的道路是正确的。
如果这不是预言性的直觉,那么什么才是呢?
亲爱的对手们。
以下是脚本代码,其中。
结果。
我的解决方案要快10倍以上。
在你的解决方案中加入保存资源的时间和使用ResourceReadImage() 将资源放入数组的时间。
在我的解决方案中,第一个和第二个都不需要。
我的解决方案要快10倍以上。
彼得,如果你用字符串工作,你在任何情况下都会失去性能。因此,听到你追逐神话般的性能是令人惊讶的,尽管你最初为它选择了一个不适合的解决方案:通过一个字符串传递消息,然后解析该消息。
彼得,如果你用字符串工作,你在任何情况下都会失去性能。因此,听到你追逐神话般的性能是令人惊讶的,尽管你最初为它选择了一个不合适的解决方案:通过字符串传递消息,然后解析该消息。
瓦西里,你还如何在程序之间传输各种类型的数据?
OnChartEvent() 部分适合。
顺便说一下,严格来说,测量小于20毫秒是完全无效的,至少在有抢占式多线程的系统中是如此。但是,即使你接受你的结果(一般情况下我承认),它仍然不能说明什么,因为重要的是全循环成本。而你所测量的只是其中的一部分。
我需要一个通用的、最快的方法。要在测试器中工作,并绕过OnChartEvent()事件队列。
正如测试所显示的,通过资源转移的速度要慢10倍。(不测量保存资源和使用ResourceReadImage() 从其中获取数据的时间) 。
我的解决方案是初始条件下的最佳选择。
...但即使你接受你的结果(一般情况下我承认),它仍然不能说明什么,因为重要的是全循环成本。而你所测量的只是其中的一部分。
诚然,但如果你推断出更多的线路和齿轮,我的方案仍然获胜。
Vasiliy,你还如何在程序之间传输各种类型的数据?
通过联合体直接映射结构到字节数组,为全局访问共享。我不知道这在技术上是否可行,但如果是这样,速度将是宇宙级的,因为你根本不需要复制任何东西。