Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
4 / 4 / 0
Регистрация: 13.02.2013
Сообщений: 37
1

"Заливка" памяти нужным значением

14.12.2013, 23:42. Показов 616. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть некий блок памяти [ ][ ][ ][ ] [ ][ ][ ][ ] [ ][ ][ ][ ]. И есть uint32_t a, равный например 0xAABBCCDD. Каким наиболее быстрым способом можно сделать так:
[AA][BB][CC][DD] [AA][BB][CC][DD] [AA][BB][CC][DD]?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2013, 23:42
Ответы с готовыми решениями:

Как прописать пол байта нужным значением?
Всем привет! Есть, к примеру в байте значение 0х12, а нужно, что б было 0хА2 или 0х1А. Как более...

Длительное ожидание элемента с нужным значением
Привет, мужики. Пишу программу на Visual Studio С# + selenium (отличное сочетание). Знания С# и...

Как сравнить DateTime с нужным значением?
Мне необходимо написать условие: сумма трех datetime = 0 Но суммирование даты мне не даст ни 0,...

Заменить указанную подстроку нужным числовым значением
Составить и отладить программу, заменяющую во введенном строковом выражении указанную подстроку...

6
25 / 25 / 16
Регистрация: 12.04.2013
Сообщений: 84
15.12.2013, 01:22 2
Могу предложить такой вариант:
C
1
2
3
4
5
u_int32_t a = 0xaabbccdd;
int n, num = 5;
char buf[512];
 
for (n = 0; n < num; n++) memcpy (buf + n * sizeof (u_int32_t), (char *)&a, sizeof (u_int32_t));
Область памяти заполняется num раз значением переменной a.
Только, если, a = 0xaabbccdd, в памяти это будет выглядить как ... dd cc bb aa dd cc bb aa ...
0
4 / 4 / 0
Регистрация: 13.02.2013
Сообщений: 37
15.12.2013, 11:10  [ТС] 3
Если я напишу функцию, которая будет последовательно вызывать в первый раз memcpy просто переменной, затем memcpy того куска, что уже есть (4 байта) затем memcpy того, что уже есть (2 * 4) и т.д. А если размер не кратен двойке - то в таком "цикле" идти только до кратного числа, остальное заполнять как у вас.
Будет ли это быстрее?
0
25 / 25 / 16
Регистрация: 12.04.2013
Сообщений: 84
15.12.2013, 14:37 4
Честно говоря не знаю, как будет быстрее.
Теоретически ваш вариант быстрее должен быть (т.к. сначала копируется 4 байта, потом 8 и т.д.)
Фактически как будет - не известно )

Если интересно, какой алгоритм будет быстрее, то напишите обе варианта функции и перед вызовом каждой функции сохраните таймштамп в какую-либо переменную
C
1
2
3
4
time_t time_before, time_after;
time_before = time (NULL);
function ();
time_after = time (NULL);
ну и сравнением разницы таймштампов можно определить какой вариант быстрее. Только делайте заполнение на большое количество байт, т.к. таймштамп имеет разрешение в 1 мс (если не ошибаюсь)
0
4 / 4 / 0
Регистрация: 13.02.2013
Сообщений: 37
15.12.2013, 14:43  [ТС] 5
Теоретически ваш вариант быстрее должен быть
Ясно, сейчас проверю.
таймштамп имеет разрешение в 1 мс (если не ошибаюсь)
У меня linux, я могу с разрешением в 1 наносекунду измерять.
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
15.12.2013, 16:03 6
Цитата Сообщение от Пациент29 Посмотреть сообщение
Будет ли это быстрее?
Будет. Более того, нормальное копирование вида
C
1
*(u_int32_t*)(buf + n * sizeof(u_int32_t)) = a;
запросто может быть быстрее за счёт векторизации, если поэлементный memcopy не будет разворачиваться при компиляции.

Не по теме:

На всякий случай дополнительно обращаю внимание на порядок байт у инициализатора.

0
4 / 4 / 0
Регистрация: 13.02.2013
Сообщений: 37
15.12.2013, 17:09  [ТС] 7
Сделал на ассемблере, получилось в 10 раз быстрее цикла на memcpy:

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
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <memory.h>
#include <stdlib.h>
#include <time.h>
 
#define VALUE 0xAABBCCDD;
 
void usualmemfill(int size)
{
    char * start = malloc(size * sizeof(uint32_t));
    int i;
    uint32_t value = VALUE;
    for (i = 0; i < size; i++)
    {
        memcpy(start + i * sizeof(uint32_t), &value, sizeof(uint32_t));
    }
    free(start);
}
 
void newmemfill(int size)
{
    char * start = malloc(size * sizeof(uint32_t));
    uint32_t value = VALUE;
 
    asm volatile("cld\n\t"
                 "rep\n\t"
                 "stosl"
                 : /* no output registers */
                 : "c" (size), "a" (value), "D" (start)
                 /*: "%ecx", "%edi*/
                 );
 
    free(start);
    (void)value;
}
 
clock_t start;
clock_t finish;
 
#define COUNT 100000
 
int main(void)
{
    int i;
 
    printf("Starting usual\n");
    start = clock();
    for (i = 0; i < COUNT; i++)
        usualmemfill(i);
    finish = clock();
    printf("Time for usual realisation : %g\n", (float)(finish - start) / CLOCKS_PER_SEC);
    printf("Starting modified\n");
    start = clock();
    for (i = 0; i < COUNT; i++)
        newmemfill(i);
    finish = clock();
    printf("Time for modified realisation : %g\n", (float)(finish - start) / CLOCKS_PER_SEC);
    return 0;
}
Код
Starting usual
Time for usual realisation : 19.81
Starting modified
Time for modified realisation : 1.88
0
15.12.2013, 17:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2013, 17:09
Помогаю со студенческими работами здесь

Заменить указанную подстроку нужным числовым значением.
Составить и отладить программу, заменяющую во введенном строковом выражении указанную подстроку...

Как найти в массиве объектов элементы с нужным значением поля?
for (i = 0; i &lt; linksData.length; ++i) { alert(&quot;source: &quot; + linksData.source + &quot; target: &quot;...

Как заменить столбец матрицы нужным значением и обновленную матрицу и вывести ее?
Дано задание: В матрице целых чисел размером 3х6 заменить третий столбец максимальным элемент и...

Заменить во введенном строковом выражении указанную подстроку нужным числовым значением
Составить и отладить программу, заменяющую во введенном строковом выражении указанную подстроку...

Заменить во введенном строковом выражении указанную подстроку нужным числовым значением
Cоставить программу, заменяющую во введенном строковом выражении указанную подстроку нужным...

Найти строку с нужным значением и заменить в ней столбцы по списку соответствия
Доброй ночи. Помогите пожалуйста с макросом для такой задачи: (пример.хлсх) Имеется книга с...

Составить программу заменяющую во введенном строковом выражении подстроку нужным числовым значением
Составить и отладить программу, заменяющую во введенном строковом выражении указанную подстроку...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru