powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / strcat - ошибка
12 сообщений из 62, страница 3 из 3
strcat - ошибка
    #38043511
На C/C++
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если у кого-то под рукой сейчас есть Windows Server 2008 R2 проверьте на ней. Или на FreeBSD, AIX.
...
Рейтинг: 0 / 0
strcat - ошибка
    #38044054
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На C/C++Microsoft Visual Studio 2010
Версия 10.0.40219.1 SP1Rel
Microsoft Visual C++ 2010
Выставлено: Maximize Speed (/O2)
/O2 - это не все опции.
Давайте сюда всю ком. строку компилятора и линкера.
Я лично не верю в такую разницу между gcc и vs по скорости кода.
...
Рейтинг: 0 / 0
strcat - ошибка
    #38044072
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На C/C++В тесте не учитывается возможность многопоточной работы и фрагментации памяти. Ясно, что у вас в куче они разложились последовательно и моментально закэшировались.

Да все там учитывалось.
Вы же не думаете, что если у вас в процессе страницы расположены рядом, то и физически они тоже рядом.
...
Рейтинг: 0 / 0
strcat - ошибка
    #38044144
На C/C++
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyНа C/C++В тесте не учитывается возможность многопоточной работы и фрагментации памяти. Ясно, что у вас в куче они разложились последовательно и моментально закэшировались.

Да все там учитывалось.
Вы же не думаете, что если у вас в процессе страницы расположены рядом, то и физически они тоже рядом.
Я же привел тест в котором явно учитывалась фрагментация и там уже не 64 раза, а 173.


компилятор/Zi /nologo /W3 /WX- /MP /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Yu"StdAfx.h" /Fp"Release\StaticVSDynamicMem.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue

линкер/OUT:"C:\VSProject\StaticVSDynamicMem\Release\StaticVSDynamicMem.exe" /INCREMENTAL:NO /NOLOGO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"Release\StaticVSDynamicMem.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\VSProject\StaticVSDynamicMem\Release\StaticVSDynamicMem.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /PGD:"C:\VSProject\StaticVSDynamicMem\Release\StaticVSDynamicMem.pgd" /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE
...
Рейтинг: 0 / 0
strcat - ошибка
    #38044175
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На C/C++Anatoly Moskovskyпропущено...

Да все там учитывалось.
Вы же не думаете, что если у вас в процессе страницы расположены рядом, то и физически они тоже рядом.
Я же привел тест в котором явно учитывалась фрагментация и там уже не 64 раза, а 173.

Ну так у меня на GCC под линуксом ваш тест дает совсем другие цифры что у вас.
2S1: 690000
2S2: 890000
2S1: 960000
2S2: 1170000

Нет даже разницы в разы, не говоря уже про десятки и сотни.

компилятор/Zi /nologo /W3 /WX- /MP /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Yu"StdAfx.h" /Fp"Release\StaticVSDynamicMem.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue

линкер/OUT:"C:\VSProject\StaticVSDynamicMem\Release\StaticVSDynamicMem.exe" /INCREMENTAL:NO /NOLOGO "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"Release\StaticVSDynamicMem.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\VSProject\StaticVSDynamicMem\Release\StaticVSDynamicMem.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /PGD:"C:\VSProject\StaticVSDynamicMem\Release\StaticVSDynamicMem.pgd" /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE
На первый взгляд все ок.
Будем ждать кого-то с виндой чтобы проверить.
(У меня винда только на виртуалках)
...
Рейтинг: 0 / 0
strcat - ошибка
    #38044180
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, счас только обратил внимание - у вас генерируется код под 32 бита, а у меня 64.
Но все равно это не объясняет такую разницу.
...
Рейтинг: 0 / 0
strcat - ошибка
    #38044502
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
#include <ctime>
#include <climits>
#include <iostream>
#include <typeinfo>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
struct S1
{
    char movieName[50];
    char producer[50];
    char compString[50];
    void set_fields(const char* movieName, const char* producer)
    {
        strcpy(this->movieName, movieName);
        strcpy(this->producer, producer);
        strcpy(this->compString, movieName);
        strcat(this->compString, "/");
        strcat(this->compString, producer);
    }
};
 
struct S2
{
    char* movieName;
    char* producer;
    char* compString;
    S2(): movieName(0), producer(0), compString(0) {}
    ~S2()
    {
        if (movieName) free(movieName);
        if (producer) free(producer);
        if (compString) free(compString);
    }
 
    void set_fields(const char* movieName, const char* producer)
    {
        this->movieName = strdup(movieName);
        this->producer = strdup(producer);
 
        this->compString = (char*)malloc(strlen(movieName) + strlen("/") + strlen(producer) + 1);
        strcpy(this->compString, movieName);
        strcat(this->compString, "/");
        strcat(this->compString, producer);
    }
};
 
template <class S> void run_test()
{
    const size_t N = 1000000;
    const size_t step = 10000;
    clock_t t1, t2;
    t1 = clock();
    S* v = new S[N];
 
    for (size_t k = 0; k != step; ++k) {
        for (size_t i = 0; i < N-step; i+=step) {
            char tmp1[50];
            char tmp2[50];
            //strcpy(tmp1, "film name");
            //strcpy(tmp2, "producer");
            sprintf(tmp1, "film name %lu", i);
            sprintf(tmp2, "producer %lu", i);
            v[i + k].set_fields(tmp1, tmp2);
        }
    }
    delete [] v;
    t2 = clock();
    cout << typeid(S).name() << ": " << (t2 - t1) << endl;
}

int main()
{
    for (size_t i = 0; i != 2; ++i) {
        run_test<S1>();
        run_test<S2>();
    }
    return 0;
}

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
set CL=/nologo /O2 /GL
set LINK=/nologo /LTCG /LARGEADDRESSAWARE /SWAPRUN:CD /SWAPRUN:NET
cl /MD /EHsc test
test
struct S1: 1171
struct S2: 2266
struct S1: 1171
struct S2: 4719

MS VS Express 2010 C++
...
Рейтинг: 0 / 0
strcat - ошибка
    #38044514
На C/C++
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov+
Код: plaintext
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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
#include <ctime>
#include <climits>
#include <iostream>
#include <typeinfo>
#include <stdio.h>
#include <string.h>
 
using namespace std;
 
struct S1
{
    char movieName[50];
    char producer[50];
    char compString[50];
    void set_fields(const char* movieName, const char* producer)
    {
        strcpy(this->movieName, movieName);
        strcpy(this->producer, producer);
        strcpy(this->compString, movieName);
        strcat(this->compString, "/");
        strcat(this->compString, producer);
    }
};
 
struct S2
{
    char* movieName;
    char* producer;
    char* compString;
    S2(): movieName(0), producer(0), compString(0) {}
    ~S2()
    {
        if (movieName) free(movieName);
        if (producer) free(producer);
        if (compString) free(compString);
    }
 
    void set_fields(const char* movieName, const char* producer)
    {
        this->movieName = strdup(movieName);
        this->producer = strdup(producer);
 
        this->compString = (char*)malloc(strlen(movieName) + strlen("/") + strlen(producer) + 1);
        strcpy(this->compString, movieName);
        strcat(this->compString, "/");
        strcat(this->compString, producer);
    }
};
 
template <class S> void run_test()
{
    const size_t N = 1000000;
    const size_t step = 10000;
    clock_t t1, t2;
    t1 = clock();
    S* v = new S[N];
 
    for (size_t k = 0; k != step; ++k) {
        for (size_t i = 0; i < N-step; i+=step) {
            char tmp1[50];
            char tmp2[50];
            //strcpy(tmp1, "film name");
            //strcpy(tmp2, "producer");
            sprintf(tmp1, "film name %lu", i);
            sprintf(tmp2, "producer %lu", i);
            v[i + k].set_fields(tmp1, tmp2);
        }
    }
    delete [] v;
    t2 = clock();
    cout << typeid(S).name() << ": " << (t2 - t1) << endl;
}

int main()
{
    for (size_t i = 0; i != 2; ++i) {
        run_test<S1>();
        run_test<S2>();
    }
    return 0;
}

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
set CL=/nologo /O2 /GL
set LINK=/nologo /LTCG /LARGEADDRESSAWARE /SWAPRUN:CD /SWAPRUN:NET
cl /MD /EHsc test
test
struct S1: 1171
struct S2: 2266
struct S1: 1171
struct S2: 4719

MS VS Express 2010 C++
А какая винда, Win7x64?
...
Рейтинг: 0 / 0
strcat - ошибка
    #38044520
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На C/C++А какая винда, Win7x64?Windows Server 2003 x64 R2 SP2.

P.S. Насколько я понял гугла, stdafx - предкомпилированные хедеры и прочая для уменьшения времени сборки (большого) проекта.
Если даже не задаваться вопросом: "Азадлянафига всё это для цатистрочного исходника-пузомерки?", то уменьшение времени сборки и оптимальная кодогенерация - не просто попиндикулярны, а прямо противоположны.
"Как-то так" (ц) Винни-Пух.
...
Рейтинг: 0 / 0
strcat - ошибка
    #38044689
На C/C++
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovНа C/C++А какая винда, Win7x64?Windows Server 2003 x64 R2 SP2.

P.S. Насколько я понял гугла, stdafx - предкомпилированные хедеры и прочая для уменьшения времени сборки (большого) проекта.
Если даже не задаваться вопросом: "Азадлянафига всё это для цатистрочного исходника-пузомерки?", то уменьшение времени сборки и оптимальная кодогенерация - не просто попиндикулярны, а прямо противоположны.
"Как-то так" (ц) Винни-Пух.
Пробовал и без предкомилированных stdafx и скомпилить x64, тоже самое.
Видите, Windows Server 2003 x64 R2 всего в 2-5 раз, а Win7x64 в сотни раз.
...
Рейтинг: 0 / 0
strcat - ошибка
    #38044807
Фотография Yatha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На чистом CYathaпропущено...


А почему 300 тактов?
Ведь за один раз сразу будем получать одну структуру, не по одному же элементу будем тянуть.
То есть, выигрыш представляется в три раза. Не три структуры за один раз, а только одну.
У Anatoly Moskovsky память выделяется под каждый элемент, а не под структуру.

Во-первых с префетчем структуры будем получать сразу все 1000000 в обоих случаях.
Во-вторых с динамическим выделением памяти под каждый элемент , в структуре хранятся только указатели , и за каждым элементом будем обращаться в кучу отдельно.

Согласен, что статический массив будет быстрее динамического. Но в учебных примерах любят выделять и освобождать память, аргументируя тем, что значение может не поместиться, да и память надо экономить. Хотя с восьмибайтовыми указателями экономия, действительно, неочевидна.
...
Рейтинг: 0 / 0
strcat - ошибка
    #38045784
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На C/C++Пробовал и без предкомилированных stdafx и скомпилить x64, тоже самое.
Видите, Windows Server 2003 x64 R2 всего в 2-5 раз, а Win7x64 в сотни раз.Т.к. в VSExpress "недоклали" x64-версии компиляторов/SDK, а вынимать необходимый минимум из "большой студии" было лень - я собирал x86-версию.

P.S. Попробуйте, всё-таки, собрать в комстроке именно с такими переменными среды и опциями компилятора.
LargeAddressAware и SwapRun - можно опустить, /arch:SSE2 - добавить :)
...
Рейтинг: 0 / 0
12 сообщений из 62, страница 3 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / strcat - ошибка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]