//+------------------------------------------------------------------+//| 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/page122年以上前の ものです。
1.グラフィックエンジンのコンセプト。
2.グラフィックコアのコンセプト。
3.MTプラットフォーム用ビジュアルスタジオの作成段階。
4.EAインタフェース作成機構の説明
グラフィカルエンジンは、インジケーターとして設計されたプログラム です。このプログラムは、ユーザーインターフェースの管理のみを目的としたものです。基本機能一式を実行する。
グラフィックエンジンは、他の指標と同様にチャートに追加 されます。以下のウィンドウがセットになっています。
これで原則的に、グラフィカル・エンジンのコンセプトは終了です。重要なのは、これがないとインターフェースの操作ができないことです。
グラフィカルエンジンとは、インターフェースに含まれるすべてのオブジェクトとウィンドウのデータを配列で記録し、ファイルに保存した情報ブロックの ことである。
このブロックは、グラフィカルインターフェースをデジタルで表現した ものです。ユーザーの要求に応じてグラフィックエンジンが読み込む。 グラフィックエンジン自体は、独自のウィンドウを動作させるためのグラフィックカーネルを内部に持ち、このカーネルの内部には、ユーザーインターフェース(デジタル形式)を統合するための空き領域が用意されています。統合は、グラフィカルコアをファイルから読み込む過程で行われます。
3.MTプラットフォームでのビジュアルスタジオの作成は、私の理解では、2つの段階に分かれます。
4.ここでは、インターフェース作成プロセスのメカニズムを概説し、その技術について少しベールを脱いでみたいと思います。ファイルによるインターフェイスの作りやすさはどこから来て いるのか、説明してください。
これは、エンジンが特殊な機能を持ち、最小限の読み込み情報で、1つのファイルをもとに完全なグラフィカルカーネルを作成 するものです。このファイルのブート情報は自明であり、人間が読むことができる。書きやすく、編集しやすい。例 えば、ウィンドウを作成 するには 「_CREATE_NEW_WINDOW 」と書き、チェックボックスの名前を「_CHECKBOX 」と書きます(エンジンは要素の名前を、要素自体の名前とそのパラメータの名前として自動的に認識します)。
この関数は "G_CORE_BUILDER() "と呼ばれ 、ユーザーによって作成された起動ファイルと、ウィンドウズやコントロールプラットフォームに含まれるすべての標準オブジェクト群を含む "CONTENT[]" 配列という二つの主要ソースからデータを取ってグラフィカルコアを構築する。"CONTENT[]" には、オブジェクトの状態やスクリプトも含まれる。すべてを1つの配列に。一般に、「CONTENT[]」のソース素材+ユーザーが作成したローダーファイルは、「G_CORE_BUILDER()」によって、エンジンが動作するグラフィックコアを構築するために使用されます。
2年間の努力の結果、用語や概念が変わっていないのはすごいことです。そして関数や配列、キーワードはここに書いてある通りです。このシナリオに沿って、すべてが実装されています。そして、この技術は、2年前にはマークアップ言語の開発経験が まったくなかったにもかかわらず、機能し、進化しているのです。
行き止まりになったわけでもなく、コンセプトを変えたわけでもなく、方向性を変えたわけでもない。エンジンもコアもマークアップ言語も、当初の 意図通りに作り続けました。そして、自分が選んだ道が正しかったことを、実践で確認する。
これが予言的直感でないとしたら、何が予言的直感なのか?
対戦相手の皆様へ。
以下は、そのスクリプトコードです。
結果
私のソリューションでは、10倍以上速くなりました。
リソースを保存する時間と、ResourceReadImage() を使ってリソースを配列に取り込む時間を、ソリューションに追加してください。
私のソリューションでは、前者も後者も必要ありません。
私のソリューションでは、10倍以上速くなりました。
ピーター ストリングで作業すると、どうしたってパフォーマンスが落ちます。ですから、もともと文字列でメッセージを渡し、そのメッセージを解析するという不向きな解決策を選んだにもかかわらず、神話的な性能を追い求めるというのは驚きです。
ピーター ストリングで作業すると、どうしたってパフォーマンスが落ちます。ですから、もともと文字列でメッセージを渡し、そのメッセージを解析するという不向きな解決策を選んだにもかかわらず、神話的なパフォーマンスを追い求めるというのは驚きですね。
バシリー 他にはどのようにして、プログラム間であらゆる種類のデータを転送しているのですか?
OnChartEvent() は部分的に適している。
ちなみに、20ミリ秒以下の計測は、厳密に言えば、少なくともプリエンプティブなマルチスレッドを持つシステムでは全く有効ではありません。しかし、自分の結果を受け入れても(一般的には認めている)、やはり何もわからない。重要なのは、フルサークルコストだからだ。そして、あなたが測定したものは、その一部に過ぎないのです。
普遍的で最速の方法が必要なのです。テスターで動作させ、OnChartEvent()イベントキューを迂回させるため。
テストでは、リソースを介した転送に10倍の速度がかかっていることがわかります。(リソースの保存と ResourceReadImage()によるデータ取得の時間を測定しない) .
私のソリューションは、初期条件下では最良の選択肢です。
...しかし、自分の結果を受け入れても(一般的には認めている)、やはり何もわからない。重要なのはフルサークルコストだからだ。そして、測定したものはその一部に過ぎません。
しかし、より多くのラインとギアに外挿すると、やはり私のオプションが勝ります。
バジリ、プログラム間であらゆる種類のデータを転送するには、他にどのような方法があるのでしょうか?
構造体をユニオンを介してバイト配列に直接マッピングし、グローバルアクセスで共有する。技術的に可能かどうかは分かりませんが、もし可能なら、一切コピーする必要がないので、スピードは宇宙規模になりますね。