程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 誰能把這個程序的性能提升一倍?---並行排序算法

誰能把這個程序的性能提升一倍?---並行排序算法

編輯:關於.NET

如下,一組4元矢量的排序,如何把排序時間縮減一半?可以用並行算法。

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace Vector4Test
{
    public class Vector
    {
        public double W;
        public double X;
        public double Y;
        public double Z;
        public double T;
    }

    internal class VectorComparer : IComparer<Vector>
    {
        public int Compare(Vector c1, Vector c2)
        {
            if (c1 == null || c2 == null)
                throw new ArgumentNullException("Both objects must not be null");
            double x = Math.Sqrt(Math.Pow(c1.X, 2)
                                 + Math.Pow(c1.Y, 2)
                                 + Math.Pow(c1.Z, 2)
                                 + Math.Pow(c1.W, 2));
            double y = Math.Sqrt(Math.Pow(c2.X, 2)
                                 + Math.Pow(c2.Y, 2)
                                 + Math.Pow(c2.Z, 2)
                                 + Math.Pow(c2.W, 2));
            if (x > y)
                return 1;
            else if (x < y)
                return -1;
            else
                return 0;
        }
    }
    internal class VectorComparer2 : IComparer<Vector> {
        public int Compare(Vector c1, Vector c2) {
            if (c1 == null || c2 == null)
                throw new ArgumentNullException("Both objects must not be null");
            if (c1.T > c2.T)
                return 1;
            else if (c1.T < c2.T)
                return -1;
            else
                return 0;
        }
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            Vector[] vectors = GetVectors();
            var watch1 = new Stopwatch();
            watch1.Start();
            A(vectors);
            watch1.Stop();
            Console.WriteLine("A sort time: " + watch1.Elapsed);
            vectors = GetVectors();
            watch1.Reset();
            watch1.Start();
            B(vectors);
            watch1.Stop();
            Console.WriteLine("B sort time: " + watch1.Elapsed);
            vectors = GetVectors();
            watch1.Reset();
            watch1.Start();
            C(vectors);
            watch1.Stop();
            Console.WriteLine("C sort time: " + watch1.Elapsed);
            Console.ReadKey();
        }

        private static Vector[] GetVectors()
        {
            int n = 1 << 15;
            var vectors = new Vector[n];
            var random = new Random();
            for (int i = 0; i < n; i++)
            {
                vectors[i] = new Vector();
                vectors[i].X = random.NextDouble();
                vectors[i].Y = random.NextDouble();
                vectors[i].Z = random.NextDouble();
                vectors[i].W = random.NextDouble();
            }
            return vectors;
        }

        private static void A(Vector[] vectors)
        {
            Array.Sort(vectors, new VectorComparer());
        }

        private static void B(Vector[] vectors) {
            int n = vectors.Length;
            for (int i = 0; i < n; i++)
            {
                Vector c1 = vectors[i];
                c1.T = Math.Sqrt(Math.Pow(c1.X, 2)
                                 + Math.Pow(c1.Y, 2)
                                 + Math.Pow(c1.Z, 2)
                                 + Math.Pow(c1.W, 2));
            }
            Array.Sort(vectors,new VectorComparer2());
        }
        private static void C(Vector[] vectors) {
            int n = vectors.Length;
            for (int i = 0; i < n; i++) {
                Vector c1 = vectors[i];
                c1.T = Math.Sqrt(c1.X * c1.X
                                 + c1.Y * c1.Y
                                 + c1.Z * c1.Z
                                 + c1.W * c1.W);
            }
            Array.Sort(vectors, new VectorComparer2());
        }

    }
}

我暈,剛開始我用的算法A,後來又寫了個算法B,我還沒用並行算法呢,一看B方法比A方法時間縮短了差不多兩個數量級,如下

A sort time: 00:00:00.5346475

B sort time: 00:00:00.0169736

太奇怪了也,難道我的B算法二級緩存命中率比較高?誰能再把我的B方法消耗時間再降低一半,可以用任何語言,Vector類等也可以用自己的數據類型,比如結構啦,四維數組啥的,隨意,只要是四元的矢量,每個分量是隨機生成的,然後每個矢量的長度是根號下每個分量的平方和,滿足這個條件就行。

modify by wawa at 2009-04-22 06:42

應大家回帖要求,

1、把隨機數種子初始的語句放到了循環外面

2、每次執行排序重新獲取新的亂序Vector

3、把B方法直接對計算出來的double[]排序換成了對對vector[]的排序,因為之前的代碼實際上沒有對vector[]排序

4、把Vector類增加了值T,用來保存該Vector的長度。

我這裡結果如下

A sort time: 00:00:00.6661531
B sort time: 00:00:00.0423115
C sort time: 00:00:00.0302426

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved