defineの専門家に質問 - ページ 10

 
Алексей Тарабанов:

さあまず定義、次に実行ファイル、そして実行ファイルの実行です。

了解しました。そのため、defineは大きなプロジェクトの 構築のみを高速化し、実行ファイルでのコード実行は高速化しません。

一般的に、自己啓発のために、私は、実行速度の観点から、ハードウェアレベルでコードを最大限に実装することに興味があります。
アーキテクチャやドメインは問わない。
完全にメモリ上で動作する言語があることは知っているので、おそらくそれが最速の解決策になるでしょう。
 
Roman:

了解しました。つまり、defineは大規模なプロジェクトの構築のみを高速化し、実行ファイルでのコード実行は高速化しないのです。

一般的に、自己啓発のために、私は、実行速度の観点から、ハードウェアレベルでコードを最大限に実装することに興味があります。
どのアーキテクチャ、どのドメインでも構いません。
完全にメモリ上で動作する言語があることは知っていますが、これがおそらく最速の解決策でしょう。

定義では、加速度が全く得られない。ただし、#define FIVE 5のように素数を定義するのは、ほんの例外です。

defineは、コードを読みやすくし、修正を容易にするためのものです。それだけです。これで機能的には完成です。

 
ISSとか医療機器とかって、どんな言葉で書いてあるんだろう。
マイクロコントローラやドライバは、C言語またはアセンブリ言語で書かれています。
他にどのような選択肢があるのでしょうか?Qを勉強された方はいらっしゃいますか?
 

IMHOプログラミングステージ))

1 「何もわからない

2 - プロシージャルスタイルを理解している(機能的なものでもなく、ちょっとしたコードです。)

3 - 機能的なスタイルで好きなものを全部書けると考えている)

4 「自分がOOPを理解していないことがよくわかった

5 - OOPを理解する

6 - まだOOPの厳しさを理解している

7 - OOPで木の結び目の組み合わせを自由に考え、それを全てハッシュ化し、自分の好みの欠陥で塩漬けにすることができる。

8 -このようなプログラミングを行うが、タイプ別に厳密なアクセスを行うなど

9 - 7点は悪(ダークサイド)であり、シビルオード(テンプレート)の世界があることを理解する。

10 - 私はクールなプログラマを考える人からますます "OOPは悪 "を聞く、つまり、メソッドの市民の使用があり、すべてが直接行うには市民上のすべての必要性はそれほど大きくないことが判明した場合、はい、それは日常ですが、コードの書き込みのアプリケーション速度私より数倍高い:( )。

11 - 現代の関数型言語が、ある段階からOOPをエミュレートしていること、関数の拡張をすべて行っていること、言い換えれば、関数型プログラミングのアプローチ(ポイント3)を理解し始めたことです。

一般的には、言語の構文から あまり違いがなく、原則は変わらない、厳格な言語とそうでない言語がある、と考えています。厳密でない言語でのコーディングは難しい。C++ C# R Q Q GO JS Rubyでは、わずかな違いもありません。

低レベルの方が速い(標準より速い、非常に速いコードの断片を自分で書くことは現実的ですが、なぜでしょうか)-例えば、標準より速いソートを書くことは簡単ですが、タイムリーなソートの本質はスピードではありません)))、最小限のアクション数であり、最小限のアクション数は必ずしも最速ではないものの非常に優れた方法なのです。

マイクロプロセッサについては、普通はそこから勉強することになりますね。言語の本質はそれほど重要ではありませんが。高水準のものは大きなコード断片を操作することができ、低水準のものはより多目的に使用することができます。

Документация по MQL5: Основы языка / Синтаксис
Документация по MQL5: Основы языка / Синтаксис
  • www.mql5.com
Синтаксис - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
いえいえ、そんなことはありません。No OOP ))
OOPは手続き言語の上のラッパーである。
それは、手続き型言語の 延長線上にありながら、独自のパラダイムを持つものです。
個人的にはOOPは高級言語のポイ捨てだと思っています ))
挙げられた言語はQ以外すべて高級言語です
Qの考え方が間違っているのでは?QはK言語の拡張版
Q言語はKDB+データベースを実装している

Kdb+ は、Kx からは

  • 高性能なクロスプラットフォームのカラムナ型歴史時系列データベース
  • インメモリ型演算エンジン
  • リアルタイムスレッドプロセッサ
  • 表現力豊かなクエリーとプログラミング言語「q

そこには、C言語的ではない、まったく異なるパラダイムが存在するのです。そこにはベクトルの論理があると思うんです。
でも、この掲示板のベテランプログラマーでも、この言語は聞いたことがないと思います))。


w

 

0.0となった。

Arthur Whitneyは、プログラミング言語qとそのデータベースkdb+を開発した。発売元:株式会社ケーエックス・システムズ2003、qは「表現力」「スピード」「効率」を主な設計目標に掲げました。
それらに匹敵するほどのものではありません。
設計上のトレードオフは簡潔さであり、冗長な従来のデータベースプログラミング環境(C++、Java、C#、Pythonなど)およびリレーショナルDBMSから来たプログラマーを混乱させる可能性がある。q プログラミングの神々は ASCII カーネルダンプのようなプログラムを喜びますが、このガイドは私たち全員のためのものです。

Qは、1950年代にハーバード大学の ケネス・アイバーソンが 数学表記法として考案した APL (プログラミング言語)から 発展した。
APLは、1960年代にIBMが、数字のリストを一度に処理するベクトル型プログラミング言語として導入したもので、Qは、このAPLから発展したものである。
金融など歯切れの良さが求められる業界で成功したのです。

ミトコンドリアDNAのqはAPLからA A +、 kへとトレースされ、いずれもベクトル上で複雑な計算を素早く行うためにうまく適応している。
q / kdb+ の新しい点は、大量の時系列データをリレーショナルパラダイムで非常に効率的に処理することです。
その構文により、SQL 92 と同様の " select " 式が使用でき、組み込み関数のコレクションにより、完全で強力なストアド プロシージャ言語が提供されます。

また、遺伝子qにも ささやきがある: 基本的なデータ構成qはリストである。呼称や用語は異なるが、記号はスキーマの対応するものを引用している。

APL qの血統は、関数型プログラミングの影響も示している。
純粋関数型プログラミングを紹介した1977年のチューリング賞受賞講演で Backusは APLからのインスピレーションを認めています。
qは純粋な関数型ではないが、基本的なデータ構造であるリストと辞書さえも数学的なマッピングとして扱われるという意味で、強い関数型である。

0.1哲学

熟練したq開発者は、C++、Java、C#、Pythonなどの従来のプログラミング環境(以下、「従来のプログラミング」と呼ぶ)とは異なる考え方をする。-
正しい考え方を身につけるために、初心者q(以後qbieと呼ぶ)のために、いくつかの不連続性の可能性をまとめておく。

ここで、従来のデータベースプログラミングにおけるデータの問題を振り返ってみよう。

  • オブジェクトのコレクションのようなメモリ上の表現は、永続化するためにテーブルのような別の表現にマップされなければならない。
    オブジェクトとリレーションの適切なマッチングを得るためには、相当な努力が必要です。
  • オブジェクトは輸送のために別の表現にマッピングされる必要があり、通常はバイナリやXML形式で参照連鎖を滑らかにする。
  • データ操作 - 大規模なデータセットに対する選択、グループ化、集計などは、データベースサーバー上のストアドプロシージャで行うのが最適です。
    複雑な数値計算は、データベースとは別にアプリケーションサーバーで行うのが最適です。
  • グラフィカルなインターフェースを表示するためのデータ変換は、別のレイヤー、例えばブラウザーのHTML5とJavaScriptで行うのが最適です。

従来のプログラミング設計のほとんどは、異なるビューを正しく表示するために費やされ、リソースを集め、異なるビューを同期させるために多くのコード行を必要とします。
q / kdb+ では意外と簡単なんです。

インタプリタブル Qは、コンパイルではなくインタプリタです。実行時には、データと関数はメモリ上のワークスペースにある。
開発サイクルの反復は、テストやデバッグに必要なすべてのランタイム情報がワークスペースですぐに利用できるため、通常は高速に行われます。
Qのプログラムは、スクリプトと呼ばれる単純なテキストファイルとして保存・実行されます。インタプリタのevalと parseルーチンが用意されているので、制御された方法で動的にコードを生成することができます。

タイプ Qは 動的型付け言語であり、型チェックはほとんど行われない。
どの変数も現在割り当てられている値の型を持っており、ほとんどの数値演算で自動的に型昇格が行われます。同種のリストに対する操作で型がチェックされる。

qを左から右へ入力すると、式は右から左へ、qの神々が好むように左から右へ 評価さ れる-これは、関数がその右側の引数に適用されることを意味する。
演算子の優先順位はなく、関数応用は括弧なしで書くことができます。句読点ノイズを大幅に低減しました。

古典的なSQLにおける NULL値とInfinity 値は、あらゆるタイプのフィールドのデータ欠損を表すNULL であり、記憶領域を占有しません。
qではnull値は型付けされ、nullでない値と同じスペースを占めます。また、数値型は無限大の値を持つ。
無限およびNULL値は、算術演算やその他の演算に参加でき、(ほぼ)予測可能な結果を得ることができます。

統合されたI/Oは 、外部への窓となる機能記述子を用いて実行される。
このような記述子が初期化されると、記述子への値の受け渡しは書き込みとなる。

このテーブルは 、ここに入るあなたというアイテムを拒絶する 方向に ある。従来の言語とは異なり、qにはクラス、オブジェクト、継承、仮想メソッドは見当たりません。
その代わり、qはテーブルをファーストクラスのオブジェクトとして持っています。オブジェクトの不足は、一見するとそれほど悪いことではありません。
Objectsは基本的に、q辞書によってモデル化された美化されたレコード(すなわち、名前付きフィールドを持つエンティティ)である。テーブルは、レコード辞書のリストと考えることができる。

配列リスト 古典SQLは集合代数なので、重複がなく、行順、列順が不定であるため、
、時系列処理が面倒で遅くなる。qの データ構造は順序付きリストに基づいているため、時系列は作成時の順序を維持する。
また、単純なリストは連続的にストレージを占有するため、大きなデータも高速に処理できます。非常に速い。

列指向のSQLテーブルは、リポジトリ全体に広がる行として組織化され、操作は行内のフィールドに適用されます。Q テーブルは連続記憶された列のリストであり、操作はすべての列に適用される。

インメモリデータベースは 、継続的にサポートされるインメモリデータベースとしてkdb+を考えることができる。データ処理はqで行うので、別途ストアドプロシージャ言語は存在しない。
実際には、kdb+はq列のリストをファイルシステムに書き出し、それをメモリにマッピングしたものをシリアライズしたものを含んでいる。

 

むすめがこぶたをかった

この議論に巻き込まれ、平和がない))

さらにいくつかのバリエーションをテストしてみましたが、MQL5は非常に良い実行時最適化を行ってくれますが、まだ......です。コンパイラの賢さに頼るのは間違っている - 不要な関数呼び出しは最適解ではない

一理も二理もない

void OnStart()
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = ArraySize(arr) - 1; i >= 0; i--)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
   
   sum = 0;
   for(int i = 0, sz = ArraySize(arr); i < sz; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum); //sum = 100
}

最初のループ -配列のインデックスの 降順で検索します.

下部ループ - インデックスの昇順で検索します。

 
Igor Makanu:

むすめがこぶたをかった

この議論に巻き込まれた、私は平和がない))

さらにいくつかのバリエーションをテストしてみましたが、MQL5は非常に良い実行時最適化を行ってくれますが、まだ......です。コンパイラの賢さに頼るのは間違っている - 不要な関数呼び出しは最適解ではない

一理も二理もない

最初のループ -配列のインデックスの 降順で検索します.

下のループ - 配列のインデックスの昇順で検索します.

関数は関数らしくない。また、配列のサイズというのは、メモリの使用量やアクセスという点では変数に等しいので、良い例ではないかもしれません。 実際、配列が宣言されたときに満たされたメモリセル内の変数なのですから。でも、配列から最大値や最小値とか、10個の変数をループさせる条件で計算するだけでは、意味がない。まずは計算して代用するのがよいでしょう。

そして、私が理解する限り、配列要素、構造体要素はメモリ上の特定のアドレスを持つ変数であり、便宜上、A[10]と10個の変数A1 A2 ...と書くだけでよいのです。A10はアクセスもサイズも同じです。もちろん型は同じです)

 
Valeriy Yastremskiy:

そして、私が理解する限り、配列要素、構造体要素はメモリ上の特定のアドレスを持つ変数であり、A[10]と10個の変数A1 A2 ...と書くのはただの便宜的なものです。A10はアクセスもサイズも同じです。コースの種類は同じです)

CPUコマンドの中で物理的に存在する場合、no

アレイはメモリ領域であり、アレイのアイテムへのアクセスはこのメモリ領域の先頭からのアイテムインデックスを計算し、格納されているタイプに応じたデータ(バイト)を抽出する。


もし、これがアルゴリズムのロジックであれば、そうです、インデックス可能な変数です。

一般に、研究中の問題については、唯一の正しい助言は、入力パラメータをチェック することがあります。保存 - データをスタックから押し出します。レジスターを保存します。レジスタを復元する。Function call - 呼んでから、返す。つまり、見えないところでいろいろなことが起きているかもしれない、ということです。だから、コンパイラに頼らず、for (int i=0; i<size; i++) を使った方が良いのです。

 
Igor Makanu:

CPUコマンドの中で物理的に存在する場合、no

配列はメモリ領域であり、配列要素へのアクセスは、このメモリ領域の先頭から要素のインデックスを計算し、格納されている型に応じたデータ(バイト)を取り出すことである。


これがアルゴリズムのロジックであれば、そうです、インデックス付き変数です。

一般に、研究中の問題については、唯一の正しい助言は、https://www.mql5.com/ru/forum/354662/page4#comment_19039624。

私もそう思います、コンパイラはブラックボックスですから、確実に決めつけることはできません。

重要なのは、思い描いたものがすべて意図したとおりに動くことです)))