Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
oldDed
0 / 0 / 0
Регистрация: 18.10.2009
Сообщений: 17
1

Из за чего большая разница во времени выпонения?

01.09.2010, 13:45. Просмотров 824. Ответов 8
Метки нет (Все метки)

Коллеги, ищу вариант быстрого поиска строки в списке строк.
Пока остановился на самом быстром варианте, но он почему то дает
трехкратную разницу от одного выполнения к другому? Что не так делаю?
Может сборка мусора?

В модуле: ////////////////////////////////////////////////////////////////////////////////////////////////

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
 
 
namespace WindowsFormsApplication1//Test
{
    public class TestModule
    {
        //Импорт функций из Kernel32.dll
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        extern static short QueryPerformanceCounter(ref long x);
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        extern static short QueryPerformanceFrequency(ref long x);
 
        public static long ctr1 = 0, ctr2 = 0, freq = 0;
 
        //========================================================================
        public static long TimeTestStart()
        {
         return (QueryPerformanceCounter(ref ctr1));
        }
        //========================================================================
        public static string TimeTestStop()
        {
          // Завершение измерения
          QueryPerformanceCounter(ref ctr2);
          // Получение делителя точности
          QueryPerformanceFrequency(ref freq);
          return ("Время выполнения: " + (ctr2 - ctr1) * 1.0 / freq + " сек.");
        }
        //========================================================================
 
 
 
        public static bool InStrList1(string str, StringCollection sc)
        {
          if (sc.Contains(str)) return true;
          else return false;
        }
 
        public static bool InStrList2(string str, StringCollection sc)
        {
         for (int i = 0; i <= sc.Count; i++)
          {
           if (sc.ToString() == str)return true;
          }
        return false;
        }
 
        public static bool InStrList3(string str, Array ar)
        {
            for (int i = 0; i <= ar.Length; i++)
             if (ar.ToString() == str ) return true;
            return false;   
        }
    }
}
В форме //////////////////////////////////////////////////////////////////////////////////////////

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.Specialized;
using System.Collections;
 
namespace WindowsFormsApplication1
{
    public partial class TestForm : Form
    {
        public TestForm()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            /*  TestModule.TimeTestStart();               
                int A = 0;
                for (int i = 0; i < 1000000; i++) { A++; }              
                label1.Text = TestModule.TimeTestStop(); */
 
            TestModule.TimeTestStart();
            StringCollection sc = new StringCollection();
            String [] ar;
            ar = new string [1000001];
            for (int i = 0; i < 1000000; i++) ar[i] = ("asfasfsada dadasd sASas");
            //for (int i = 0; i < 1000000; i++) sc.Add("asfasfsada dadasd sASas");
            sc.AddRange(ar);
            ar[1000000] = ("qq");
            if (TestModule.InStrList1("qq", sc)) label1.Text = "qq!!!";
            label2.Text = TestModule.TimeTestStop();
 
           
            
           /* TestModule.TimeTestStart();
            ArrayList al = new ArrayList();
            //sa = new Array ;
            for (int i = 0; i < 1000000; i++) al.Add ("asfasfsada dadasd sASas") ;
            al.Add ("asfasf");
            if (TestModule.InStrList2("asfasf", al)) label1.Text = "qq!!!";
            label1.Text = TestModule.TimeTestStop(); */
        }
    }
}
Буду признателен за любые замечания
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2010, 13:45
Ответы с готовыми решениями:

Большая ли разница для новичка в книгах Рихтера (CLR via c#).Net 2.0 и 4.5?
Есть книга у знакомого (Рихтер Дж. Clr via c# .Нет фрэймворк 2.0) , но не будет...

Большая разница между POST и GET запросами в скорости?
Здравствуйте, сейчас заметил такую вещь: Отправка GET запроса: Как видим...

Разница во времени
Собственно вопрос: Как отнять время которое сейчас, от времени в переменной?...

Большая разница по ут 8.3 и 8.2 ?
Искал книги по 1с управление торговлей 8.3 но не нашел а по 8.2 книги легко...

Большая ли разница в оперативке?
Вот 2 оперативные памяти, обе я нашел в совместимых устройствах к моей...

8
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
01.09.2010, 16:12 2
Цитата Сообщение от oldDed Посмотреть сообщение
Коллеги, ищу вариант быстрого поиска строки в списке строк.
Пока остановился на самом быстром варианте, но он почему то дает
трехкратную разницу от одного выполнения к другому? Что не так делаю?
Может сборка мусора?

В модуле: ////////////////////////////////////////////////////////////////////////////////////////////////

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Collections.Specialized;
 
 
namespace WindowsFormsApplication1//Test
{
    public class TestModule
    {
        //Импорт функций из Kernel32.dll
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        extern static short QueryPerformanceCounter(ref long x);
        [System.Runtime.InteropServices.DllImport("kernel32.dll")]
        extern static short QueryPerformanceFrequency(ref long x);
 
        public static long ctr1 = 0, ctr2 = 0, freq = 0;
 
        //========================================================================
        public static long TimeTestStart()
        {
         return (QueryPerformanceCounter(ref ctr1));
        }
        //========================================================================
        public static string TimeTestStop()
        {
          // Завершение измерения
          QueryPerformanceCounter(ref ctr2);
          // Получение делителя точности
          QueryPerformanceFrequency(ref freq);
          return ("Время выполнения: " + (ctr2 - ctr1) * 1.0 / freq + " сек.");
        }
        //========================================================================
 
 
 
        public static bool InStrList1(string str, StringCollection sc)
        {
          if (sc.Contains(str)) return true;
          else return false;
        }
 
        public static bool InStrList2(string str, StringCollection sc)
        {
         for (int i = 0; i <= sc.Count; i++)
          {
           if (sc.ToString() == str)return true;
          }
        return false;
        }
 
        public static bool InStrList3(string str, Array ar)
        {
            for (int i = 0; i <= ar.Length; i++)
             if (ar.ToString() == str ) return true;
            return false;   
        }
    }
}
В форме //////////////////////////////////////////////////////////////////////////////////////////

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.Specialized;
using System.Collections;
 
namespace WindowsFormsApplication1
{
    public partial class TestForm : Form
    {
        public TestForm()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            /*  TestModule.TimeTestStart();               
                int A = 0;
                for (int i = 0; i < 1000000; i++) { A++; }              
                label1.Text = TestModule.TimeTestStop(); */
 
            TestModule.TimeTestStart();
            StringCollection sc = new StringCollection();
            String [] ar;
            ar = new string [1000001];
            for (int i = 0; i < 1000000; i++) ar[i] = ("asfasfsada dadasd sASas");
            //for (int i = 0; i < 1000000; i++) sc.Add("asfasfsada dadasd sASas");
            sc.AddRange(ar);
            ar[1000000] = ("qq");
            if (TestModule.InStrList1("qq", sc)) label1.Text = "qq!!!";
            label2.Text = TestModule.TimeTestStop();
 
           
            
           /* TestModule.TimeTestStart();
            ArrayList al = new ArrayList();
            //sa = new Array ;
            for (int i = 0; i < 1000000; i++) al.Add ("asfasfsada dadasd sASas") ;
            al.Add ("asfasf");
            if (TestModule.InStrList2("asfasf", al)) label1.Text = "qq!!!";
            label1.Text = TestModule.TimeTestStop(); */
        }
    }
}
Буду признателен за любые замечания
по части кода не подскажу, но вот сразу же напрашивается вопрос, а вы не пробовали использовать регулярные выражения, возможно они будут быстрее чем вышеперечисленные методы?
0
NickoTin
Почетный модератор
Эксперт .NET
8448 / 3570 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
01.09.2010, 20:11 3
C#
1
2
3
4
5
6
7
8
9
10
Stopwatch sw = new Stopwatch();
List<string> sc = new List<string>();
sw.Start();
string[] arr = new string[1000001];
for (int i = 0; i < 1000001; i++) arr[i] = "asfasfsada dadasd sASas";
sc.AddRange(arr);
sc[1000000] = ("qq");
if (sc.Contains("qq")) MessageBox.Show("Contains");
sw.Stop();
MessageBox.Show("Time: " + sw.Elapsed.Milliseconds.ToString());
Результат: 370-430 мс.

Добавлено через 18 минут
Первый результат, кстати, всегда будет больше последующих.
1
oldDed
0 / 0 / 0
Регистрация: 18.10.2009
Сообщений: 17
02.09.2010, 04:56  [ТС] 4
Спасибо. Про регулярные выражения почитаю.
Странно, что наиболее быстро в таком варианте
работает именно связка массива и коллекции, а
по отдельности и то и другое медленнее...
Чего то мелкосовтковцы намудрили. Элементарное
вроде бы действо
0
Alligieri
CEO
Эксперт С++
2253 / 1243 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
02.09.2010, 10:03 5
oldDed, массив в .NET не сильно отличается от колекции - ибо оба создают классы для своей работы, а это медленее.
Для выделения подстрок лутше таки RegEx юзать
0
oldDed
0 / 0 / 0
Регистрация: 18.10.2009
Сообщений: 17
02.09.2010, 13:42  [ТС] 6
Регулярные выражения не то. Нужно сравнивать не подстроку
в строке а именно строку с другими строками в чистом виде без
масок и фильтров. На данный момент эмпирически самый быстрый
вариант. Может кому сгодится.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class TestModule
{
public static bool InStrList(string str, string [] ar)
        {
            for (int i = 0; i <= ar.Length; i++)
                if (ar[i].ToString() != str) {}
            else return true;
        return false;
        }
}
 
 
 private void button1_Click(object sender, EventArgs e)
        {
            TestModule.TimeTestStart();
            String [] ar;
            ar = new string [1000000];
            for (int i = 0; i < 1000000; i++) ar[i] = ("asfasfsada dadasd sASas");
            ar[999999] = ("qq");
            if (TestModule.InStrList("qq", ar)) label1.Text = "qq!!!";
            label2.Text = TestModule.TimeTestStop();
        }
Время около 29 мс стабильное. Лучше(быстрее) сравнивать именно на
НЕравенство.

Всем спасибо. Закрываю тему.
0
Maxim Prishchepa
Эксперт С++
1924 / 1036 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
06.09.2010, 12:00 7
Цитата Сообщение от oldDed Посмотреть сообщение
Регулярные выражения не то. Нужно сравнивать не подстроку
в строке а именно строку с другими строками в чистом виде без
масок и фильтров. На данный момент эмпирически самый быстрый
вариант. Может кому сгодится.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class TestModule
{
public static bool InStrList(string str, string [] ar)
        {
            for (int i = 0; i <= ar.Length; i++)
                if (ar[i].ToString() != str) {}
            else return true;
        return false;
        }
}
 
 
 private void button1_Click(object sender, EventArgs e)
        {
            TestModule.TimeTestStart();
            String [] ar;
            ar = new string [1000000];
            for (int i = 0; i < 1000000; i++) ar[i] = ("asfasfsada dadasd sASas");
            ar[999999] = ("qq");
            if (TestModule.InStrList("qq", ar)) label1.Text = "qq!!!";
            label2.Text = TestModule.TimeTestStop();
        }
Время около 29 мс стабильное. Лучше(быстрее) сравнивать именно на
НЕравенство.

Всем спасибо. Закрываю тему.
могу предположить, что выиграете еще несколько мс, если уберёте преобразование элемента массива строк к строке, а именно ".ToString()" в if (ar[i].ToString() != str) {}
1
Mikant
1282 / 955 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
06.09.2010, 15:53 8
а попоробовать прочитать мой пост про строки (в корне раздела C# этого форума) не пробовали?




string.Compare надо юзать

Добавлено через 7 минут
и так, для общего развития рекомендую почитать зачем существует операция интернирования строк в шарпе... ну и когда она в джиттере вызывается...
0
oldDed
0 / 0 / 0
Регистрация: 18.10.2009
Сообщений: 17
08.09.2010, 19:45  [ТС] 9
Цитата Сообщение от l_a_m Посмотреть сообщение
могу предположить, что выиграете еще несколько мс, если уберёте преобразование элемента массива строк к строке, а именно ".ToString()" в if (ar[i].ToString() != str) {}
Спасибо, неравнодушный ЧЕЛОВЕК. Действительно, -2-3 мс. Теория НЕ рсходитвся с практикой!

Добавлено через 7 минут
Цитата Сообщение от Mikant Посмотреть сообщение
а попоробовать прочитать мой пост про строки (в корне раздела C# этого форума) не пробовали?




string.Compare надо юзать

Добавлено через 7 минут
и так, для общего развития рекомендую почитать зачем существует операция интернирования строк в шарпе... ну и когда она в джиттере вызывается...
Пробовал. Читайте мои варианты поиска. Compare, к сожалению в большой Ж, по сравнению с поиском в массиве STRING
0
08.09.2010, 19:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2010, 19:45

Большая ли разница между мониторами 60 и 75 Гц
Большая ли разница между мониторами 60 и 75 Гц. И какой взять?

Большая разница в количестве bad секторов
доброго дня! проблема в следующем. есть жесткий диск, с файловой системой raw....

Температура i7-3770k и ядер(большая разница)
Вообщем в игре ArcheAge на фул графике мне кажется большая температура,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru