none
Очень Долго Считает ! В чем Проблема? RRS feed

  • Вопрос

  •  не давно написал программу она работает правельно но очень долго рачсчитывает! обьект (Cells[i, 2]).Value2 к примеру ячейки от куда я считываю данные ,Val[v] это массив валют там их около 7,DSK[k],Passiv[p].Aktiv[j]  неки массив где сожержатся список ID,

     

    for (int i = 2; i <= 65000; i++)

    {

     

    /* */R = Convert.ToString((Cells[i, 2]).Value2);

     

    /*ID*/ A = Convert.ToString((Cells[i, 1]).Value2);

     

    /**/ C = Convert.ToDouble((Cells[i, 3]).Value2);

     

     

    /**/ F = Convert.ToString((Cells[i, 6]).Value2);

     

     

    if (R == string.Empty)

    {

     

    for (int v = 0; v < Val.Length; v++)

    {

     

    for (int j = 0; j < Aktiv.Length; j++)

     

    for (int k = 0; k < DSK.Length; k++)

     

    for (int p = 0; p < Passiv.Length; p++)

    {

     

    if (((A == Aktiv[j]) || (A == DSK[k])) && (F == Val[v]))

    { SumA[v, 7] = SumA[v, 7] + C; }

     

    if ((A == DSK[k]) && (F == Val[v]))

    { SumD[v, 7] = SumD[v, 7] + C; }

     

    if ((A == Passiv[p]) && (F == Val[v]))

    { SumP[v, 7] = SumP[v, 7] + C; }

    }

     

    }

    }

    }

    12 октября 2010 г. 12:00

Ответы

  • Найдите способ избавиться  от большого количества итераций. Специально разбираться в вашем коде не хочется.

    • Помечено в качестве ответа PashaPashModerator 15 октября 2010 г. 12:34
    15 октября 2010 г. 7:45
  • Здеь просто надо было для каждого цикл задать,а не общий! это часть кода , принцип такойже в остальном!

     

    for (int i = 2; i <= 65535; i++)

    {

    for (int v = 0; v < Val.Length; v++)

    {

     

    for (int j = 0; j < Aktiv.Length; j++)

     

    for (int k = 0; k < DSK.Length; k++)

    {

     

    if (((A == Aktiv[j]) || (A == DSK[k])) && (F == Val[v]))

    { SumA[v, 7] = SumA[v, 7] + C; }

    }

     

    for (int k = 0; k < DSK.Length; k++)

    {

     

    if ((A == DSK[k]) && (F == Val[v]))

    { SumD[v, 7] = SumD[v, 7] + C; }

    }

     

    for (int p = 0; p < Passiv.Length; p++)

    {

     

    if ((A == Passiv[p]) && (F == Val[v]))

    { SumP[v, 7] = SumP[v, 7] + C; }

    }

    }

     

    }

    • Помечено в качестве ответа Jualy 15 октября 2010 г. 11:41
    15 октября 2010 г. 11:41

Все ответы

  • Наверно, потому что код до опупения (до 65000) перебирает строки в экселевской таблице.
    12 октября 2010 г. 12:25
    Модератор
  • Нет! перед этим я писал такую же программу она работало 3 минуты с таким обьемом строки,а здесь тоже самое количество строк токо здесь внутри условий идет матрица , без матрицы никак не обоитись , если вручную писать условие там получится нереально большое количество строк кода! У меня болше нет идей токо это, если есть получше подскажите ,

    здесб расматривается токо те строки которые пустые есть дальше в блоке else{} с заполнеными строками,тоже самы алгоритм , вот там и долго расчитывается!

    продолжительность этой программы примерно 5-6 часов!

    13 октября 2010 г. 8:27
  • Попробуй при помощи профайлера выяснить, где тратится больше всего времени.
    13 октября 2010 г. 9:49
    Модератор
  • умножьте это и напишите результат: 65000 * Aktiv.Length * DSK.Length * Passiv.Length

    ..и да профайлер не забывайте

     

    13 октября 2010 г. 18:54
  • Я непонимаю что за профайлер? Я знаю что много времени тратятся на выполнение условии так как там матрица находится! вот и эту проблему и надо решить!

    14 октября 2010 г. 6:50
  • Приведи изолированный рабочий кусок кода, который другие могли бы запустить.

    Много времени может уходить из-за того, что массивы Aktiv/DSK/Passiv у тебя длиной под 1000 элементов - тогда твой алгоритм делает 65000 миллиардов циклов. Поэтому OlegGel и попросил размеры массивов. На массивах из 3-х элементов ведь не тормозит? :)

    14 октября 2010 г. 7:24
    Модератор
  •  

    Вот Код!  

    string A, F;//ID

     

    DateTime B = new DateTime();//

     

    DateTime D = this.dateTimePicker1.Value;//

     

    double C;//

     

    string R;//

     

    int dni;//

     

    double[,] SumA = new double[8, 8];

     

    double[,] SumD = new double[8, 8];

     

    double[,] SumP = new double[8, 8];

     

    double[,] SumR = new double[8, 8];

     

     

    double[] GorA = new double[8];

     

    double[] GorD = new double[8];

     

    double[] GorP = new double[8];

     

    double[] GorR = new double[8];

     

    double[] VerA = new double[8];

     

    double[] VerD = new double[8];

     

    double[] VerP = new double[8];

     

    double[] VerR = new double[8];

     

    string[] Val ={"EUR",

     

    "GBP",

     

    "KZT",

     

    "RUR",

     

    "USD",

     

    "CHF",

     

    "CNY"

    };

    //

     

    int MAX = 50000;

    {

     

    ///////////////////// ////////////////////////////////////////////////////////////////////

     

    // .

    Microsoft.Office.Interop.Excel.

    Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();

     

    // .

    Microsoft.Office.Interop.Excel.

    Workbook ObjWorkBook = ObjExcel.Workbooks.Open(textBox2.Text, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);

     

    // ().

    Microsoft.Office.Interop.Excel.

    Worksheet ObjWorkSheet;

    ObjWorkSheet = (Microsoft.Office.Interop.Excel.

    Worksheet)ObjWorkBook.Sheets[1];

     

     

     

    for (int i = 2; i <= MAX; i++)

    {

     

     

    A =

    Convert.ToString(((Microsoft.Office.Interop.Excel.Range)ObjWorkSheet.Cells[i, 1]).Value2);

    C =

    Convert.ToDouble(((Microsoft.Office.Interop.Excel.Range)ObjWorkSheet.Cells[i, 3]).Value2);

    F =

    Convert.ToString(((Microsoft.Office.Interop.Excel.Range)ObjWorkSheet.Cells[i, 6]).Value2);

    B = Convert.ToDateTime(((Microsoft.Office.Interop.Excel.Range)ObjWorkSheet.Cells[i, 2]).Value2);

    {

    dni =

    Convert.ToInt32((D - B).TotalDays);

     

    for (int v = 1; v < Val.Length; v++)

    {

     

    for (int j = 1; j < Aktiv.Length; j++)

     

     

    for (int k = 1; k < DSK.Length; k++)

     

     

    for (int p = 1; p < Passiv.Length; p++)

    {

    ///////////// ///////////////////

     

    if ((dni <= 0) && ((A == Aktiv[j]) || (A == DSK[k])) && (F == Val[v]))

    { SumA[v, 0] = SumA[v, 0] + C; }

     

    if ((dni <= 0) && (A == DSK[k]) && (F == Val[v]))

    { SumD[v, 0] = SumD[v, 0] + C; }

     

    if ((dni <= 0) && (A == Passiv[p]) && (F == Val[v]))

    { SumP[v, 0] = SumP[v, 0] + C; }

     

    ///////// 0 7//////////////////////

     

    if (((dni > 0) && (dni <= 7)) && ((A == Aktiv[j]) || (A == DSK[k])) && (F == Val[v]))

    { SumA[v, 1] = SumA[v, 1] + C; }

     

    if (((dni > 0) && (dni <= 7)) && (A == DSK[k]) && (F == Val[v]))

    { SumD[v, 1] = SumD[v, 1] + C; }

     

    if (((dni > 0) && (dni <= 7)) && (A == Passiv[p]) && (F == Val[v]))

    { SumP[v, 1] = SumP[v, 1] + C; }

     

    ////////////// 7 30//////////////////

     

    if (((dni > 7) && (dni <= 30)) && ((A == Aktiv[j]) || (A == DSK[k])) && (F == Val[v]))

    { SumA[v, 2] = SumA[v, 2] + C; }

     

    if (((dni > 7) && (dni <= 30)) && (A == DSK[k]) && (F == Val[v]))

    { SumD[v, 2] = SumD[v, 2] + C; }

     

    if (((dni > 7) && (dni <= 30)) && (A == Passiv[p]) && (F == Val[v]))

    { SumP[v, 2] = SumP[v, 2] + C; }

     

    ///////////////// 30 90////////////////////////////

     

    if (((dni > 30) && (dni <= 90)) && ((A == Aktiv[j]) || (A == DSK[k])) && (F == Val[v]))

    { SumA[v, 3] = SumA[v, 3] + C; }

     

    if (((dni > 30) && (dni <= 90)) && (A == DSK[k]) && (F == Val[v]))

    { SumD[v, 3] = SumD[v, 3] + C; }

     

    if (((dni > 30) && (dni <= 90)) && (A == Passiv[p]) && (F == Val[v]))

    { SumP[v, 3] = SumP[v, 3] + C; }

     

    /////////////// 90 360///////////////////////////

     

    if (((dni > 90) && (dni <= 360)) && ((A == Aktiv[j]) || (A == DSK[k])) && (F == Val[v]))

    { SumA[v, 4] = SumA[v, 4] + C; }

     

    if (((dni > 90) && (dni <= 360)) && (A == DSK[k]) && (F == Val[v]))

    { SumD[v, 4] = SumD[v, 4] + C; }

     

    if (((dni > 90) && (dni <= 360)) && (A == Passiv[p]) && (F == Val[v]))

    { SumP[v, 4] = SumP[v, 4] + C; }

     

    /////////////// 360 1080 //////////////////////

     

    if (((dni > 360) && (dni <= 1080)) && ((A == Aktiv[j]) || (A == DSK[k])) && (F == Val[v]))

    { SumA[v, 5] = SumA[v, 5] + C; }

     

    if (((dni > 360) && (dni <= 1080)) && (A == DSK[k]) && (F == Val[v]))

    { SumD[v, 5] = SumD[v, 5] + C; }

     

    if (((dni > 360) && (dni <= 1080)) && (A == Passiv[p]) && (F == Val[v]))

    { SumP[v, 5] = SumP[v, 5] + C; }

     

    ///////////// 1080////////////////////

     

    if ((dni > 1080) && ((A == Aktiv[j]) || (A == DSK[k])) && (F == Val[v]))

    { SumA[v, 6] = SumA[v, 6] + C; }

     

    if ((dni > 1080) && (A == DSK[k]) && (F == Val[v]))

    { SumD[v, 6] = SumD[v, 6] + C; }

     

    if ((dni > 1080) && (A == Passiv[p]) && (F == Val[v]))

    { SumP[v, 6] = SumP[v, 6] + C; }

    }

     

     

    }

    }

     

    Application.DoEvents();

    }

    ObjExcel.Quit();

    14 октября 2010 г. 7:55
  • Это матрица

    string[] DSK ={"1001","1002","1003","1004","1005","1006","1007","1008",

     

    "1009","1011","1012","1013","1051","1052","1053","1101",

     

    "1102","1103","1104","1105","1106"

    };

    //

     

    string[] Aktiv = { "1054","1201","1202",

    "1205"

     

    ,

    "1206"

     

    ,

    .........

     

     

     

    "1818",

     

    "1819"

     

    ,

    "1834",

    "1860"

     

    ,

    "1861"

     

    ,

    "1864"

     

    ,

    "1867"

     

    ,

    "1870"

     

    ,

    "1873"

     

    ,

     

     

     

    "1892",

    "1893"

     

    ,

    "1894"

     

    ,

    "1895"

     

    ,

    "1899"

    };

    //

    string[] Passiv = { "2011",

    "2012"

     

    ,

    "2013"

     

    ,

    "2014"

     

    ,

    ........

    "2895"

     

    ,

    "2899"

    };

     

    14 октября 2010 г. 7:59
  • А что означают многоточия в определении массивов? Я так понимаю - "продолжить по аналогии"? Если да, то размеры массивов у вас такие примерно: 21, 627, 888, 65000. Умножаем: 21 * 627 * 888 * 65000 = 760 млрд.. итераций:)

    Ну что могу сказать - вам повезло, что живете в 21 веке с хорошими компьютерами, в 80х годах прошлого века вычисляли бы не несколько часов, а несколько дней:)

     

    Вот у меня простой тест

            static void Main(string[] args)

            {

                int a = 1, b = 2, c;

                Stopwatch timer = new Stopwatch();

                timer.Start();

                for (int i = 0; i < 65000; i++)

                {

                    for (int j = 0; j < 888; j++)

                    {

                        for (int k = 0; k < 627; k++)

                        {

                            for (int m = 0; m < 21; m++)

                            {

                                c = a + b;

                            }

                        }

                    }

                }

                timer.Stop();

                Console.WriteLine("Elapsed time: " + timer.Elapsed.ToString());

            }

    показал

    Elapsed time: 00:15:34.7675005

    но сложить и присвоить - это всего несколько тактов процессора.

    Предположим, что ваши операции на каждой итерации занимают 100 тактов процессора, процессор 3 Гц, считаем время 21 * 627 * 888 * 65000 * 100 / 3000000000 = 25000 секунд = 7 часов

    Можете скиуть пару-тройку часов на то, что современные процессоры за один такт могут несколько операций обрабатывать

    14 октября 2010 г. 8:23
  • Есть другой Алгоритм , который работает по шустрее?  мне один тип утверждает что эту операцию другой программист делал за считанные минуты! Так подумал , это же нереально! То ли он врет!

    14 октября 2010 г. 9:04
  • Найдите способ избавиться  от большого количества итераций. Специально разбираться в вашем коде не хочется.

    • Помечено в качестве ответа PashaPashModerator 15 октября 2010 г. 12:34
    15 октября 2010 г. 7:45
  • Чтобы ответить на этот вопрос, нужно знать что за задачу ты пытаешься решить. Из реализации алгоритма, IMHO, непонятно что и зачем он делает.
    15 октября 2010 г. 11:02
    Модератор
  • Cпасибо за поддержку ! я уже разобрался !
    15 октября 2010 г. 11:08
  • Пожалуйста, покажи решение и пометь его как ответ.
    15 октября 2010 г. 11:31
    Модератор
  • Здеь просто надо было для каждого цикл задать,а не общий! это часть кода , принцип такойже в остальном!

     

    for (int i = 2; i <= 65535; i++)

    {

    for (int v = 0; v < Val.Length; v++)

    {

     

    for (int j = 0; j < Aktiv.Length; j++)

     

    for (int k = 0; k < DSK.Length; k++)

    {

     

    if (((A == Aktiv[j]) || (A == DSK[k])) && (F == Val[v]))

    { SumA[v, 7] = SumA[v, 7] + C; }

    }

     

    for (int k = 0; k < DSK.Length; k++)

    {

     

    if ((A == DSK[k]) && (F == Val[v]))

    { SumD[v, 7] = SumD[v, 7] + C; }

    }

     

    for (int p = 0; p < Passiv.Length; p++)

    {

     

    if ((A == Passiv[p]) && (F == Val[v]))

    { SumP[v, 7] = SumP[v, 7] + C; }

    }

    }

     

    }

    • Помечено в качестве ответа Jualy 15 октября 2010 г. 11:41
    15 октября 2010 г. 11:41
  • Поистине мистический ответ...

    15 октября 2010 г. 12:21