目的は、Node.jsのソースコードからの二重リンクリストの実装を改善することでした 。 このコードは高速で効率的ですが、非アクティブタイマーのリストを保存する特定のアプリケーション向けに作成されています。 したがって、idleNextおよびidlePrevフィールドは、保存されたオブジェクトに直接追加されます。 競技者は、パフォーマンスを損なうことなくコードを普遍化する(1つの要素が複数の独立したリストに同時に属することができるようにする)タスクに直面していました。
明らかな解決策は、next、prev、およびvalueフィールドを含む中間オブジェクト(リストリンク)を追加することです。 しかし、このアプローチには重大な欠点があります。保存されたオブジェクトへのリンクのみがあり、リストからそれを削除する必要がある場合、チェーン全体をソートする必要があります。 パフォーマンスが低下します。
idleNextおよびidlePrevフィールドの代わりに、異なるリストで異なる名前のフィールドのペアが使用される、より高いソリューションを評価しました。 ただし、「ピリオド」ではなく「角括弧」演算子を使用してオブジェクトのメンバーにアクセスすると、V8コンパイラは重要な最適化を実行できないため、コードの動作が遅くなります。
自己修正コードを使用した参加者には賞が授与されました。 リストの実装でidleNextとidlePrevを他の名前に置き換えてから、インタープリターに結果のコードを実行させる(ドット演算子を使用)場合、パフォーマンスは低下しません。
参加者にポイントを付与した方法とその対象に関する詳細、および受け取ったすべての決定は、 GitHubのリポジトリにあります 。 受賞者の皆さん、おめでとうございます!
- Sergey Shpak-プライズ1500 USD
- Ori Shalev-プライズ1000 USD
- Alexander Lyakshev-プライズ500 USD
それとは別に、最年少の参加者をマークすることにしました。そのうちの1人は12歳で、もう1人は15歳です。 チームは7位になりました。 ドミトリーとルスランは350米ドルの特別賞を受賞しました。
私たちはすでに次のコンテストのタスクについて考えています。