jjzjj

c++ - 使用大数组索引增加访问时间

coder 2023-06-03 原文

问题

我目前编写了一个包含大数组的程序,我对不同数组的处理时间感到非常困惑。一方面我有 7 个“较小”的数组(<=65536 个元素),另一方面我有="" 7="" 个大数组(65536="">< 元素=""><=>
我只想增加循环中的各种元素。每个循环我都会在每个数组的相同索引处增加元素。
这意味着我想在同一索引处增加所有 14 个数组的每个循环。这需要 21 秒。如果我只增加 7 个较小的数组,它只需要 2 秒,如果我只增加 7 个较大的数组,则需要 18 秒!
为了更好地说明,我编写了一个示例代码:

#include <iostream>
#include <time.h>

using namespace std;

int main(int argc,char* argv[])
{
    int i;

    int* ExampleArray1 = new int [16384];       // 3 "small" arrays (2^14)
    int* ExampleArray2 = new int [32768];       //                  (2^15)
    int* ExampleArray3 = new int [65536];       //                  (2^16)
    for(i=0 ; i<16384 ; i++) {ExampleArray1[i] = 0;}
    for(i=0 ; i<32768 ; i++) {ExampleArray2[i] = 0;}
    for(i=0 ; i<65536 ; i++) {ExampleArray3[i] = 0;}

    int* ExampleArray4 = new int [16777216];    // 3 large arrays   (2^24)
    int* ExampleArray5 = new int [33554432];    //                  (2^25)
    int* ExampleArray6 = new int [67108864];    //                  (2^26)
    for(i=0 ; i<16777216 ; i++) {ExampleArray4[i] = 0;}
    for(i=0 ; i<33554432 ; i++) {ExampleArray5[i] = 0;}
    for(i=0 ; i<67108864 ; i++) {ExampleArray6[i] = 0;}

    int until;

    clock_t start,stop;
    cout << "Until: "; cin >> until;

    start = clock();
    for(i=0 ; i<until; i++)
    {
        ExampleArray1[1]++;
        ExampleArray2[1]++;
        ExampleArray3[1]++;
    }
    stop = clock();
    cout << "Time: " << static_cast<float>(stop-start)/CLOCKS_PER_SEC << " sec.\n";

    start = clock();
    for(i=0 ; i<until; i++)
    {
        ExampleArray4[1]++;
        ExampleArray5[1]++;
        ExampleArray6[1]++;
    }
    stop = clock();
    cout << "Time: " << static_cast<float>(stop-start)/CLOCKS_PER_SEC << " sec.\n";

    delete[] ExampleArray1; ExampleArray1 = NULL;
    delete[] ExampleArray2; ExampleArray2 = NULL;
    delete[] ExampleArray3; ExampleArray3 = NULL;
    delete[] ExampleArray4; ExampleArray4 = NULL;
    delete[] ExampleArray5; ExampleArray5 = NULL;
    delete[] ExampleArray6; ExampleArray6 = NULL;

    getchar();
    return 0;
}

另一个令人困惑的地方是编译模式之间的时间差。
作为“直到”我输入了 10 亿。

输出 -> Debug模式(标准):
Time: 6 sec.
Time: 26 sec.

输出 -> Release模式(完全优化启用[/Ox](我相信这是标准)):
Time: 34 sec.
Time: 47 sec.

输出 -> Release模式(禁用属性表中的优化[/Od]):
Time: 25 sec.
Time: 25 sec.

但是,如果我稍微更改代码并用赋值替换增量,则输出会有所不同:
[...]
int until;
int value;

clock_t start,stop;
cout << "Until: "; cin >> until;
cout << "Value: "; cin >> value;

start = clock();
for(i=0 ; i<until; i++)
{
    ExampleArray1[1]=value;
    ExampleArray2[1]=value;
    ExampleArray3[1]=value;
}
stop = clock();
cout << "Time: " << static_cast<float>(stop-start)/CLOCKS_PER_SEC << " sec.\n";

start = clock();
for(i=0 ; i<until; i++)
{
    ExampleArray4[1]=value;
    ExampleArray5[1]=value;
    ExampleArray6[1]=value;
}
stop = clock();
cout << "Time: " << static_cast<float>(stop-start)/CLOCKS_PER_SEC << " sec.\n";
[...]

输出 -> Debug模式(标准):
Time: 4 sec.
Time: 28 sec.

输出 -> Release模式(启用完全优化[/Ox]):
Time: 38 sec.
Time: 38 sec.

输出 -> Release模式(禁用优化[/Od]):
Time: 24 sec.
Time: 28 sec.

我认为数组的访问时间总是相同的。
我使用的是 Visual Studio 2012 32 位 Express 和 Windows 7 64 位。
我所有的东西都测试了好几次。时间大致相同(但最多 +/- 6 秒),我取了一个四舍五入的平均值。
我的问题是:

问题
  • 为什么不同数组大小的时间差异如此之大? -> 在不拆分大数组的情况下,这是可以避免的吗?
  • 为什么 Debug模式比 Release模式需要更少的时间?
  • 没有优化的 Release模式比有优化的 Release模式更快的原因是什么?

  • 提前致谢。

    编辑:

    系统数据:
  • 处理器:AMD Phenom II X6 1045T (6 x 2,7GHz)
  • 一级缓存:768 KB (2x6x64 KB) 2-way | L2 高速缓存:3072 KB (6x512 KB) 16 路 | L3 缓存:6 MB 48 路关联
  • 内存:2x 4GB DDR3
  • SSD硬盘

  • 反汇编(带有增量的第一个代码)

    反汇编 - VS 2012 (Express)

    Debug模式下的反汇编在每种情况下(大数组和小数组)都是相同的。
    例如 Array1 和第一个循环的标题:
        for (i = 0; i<until; i++)
    01275FEA  mov         dword ptr [i],0  
    01275FF1  jmp         main+21Ch (01275FFCh)  
    01275FF3  mov         eax,dword ptr [i]  
    01275FF6  add         eax,1  
    01275FF9  mov         dword ptr [i],eax  
    01275FFC  mov         eax,dword ptr [i]  
    01275FFF  cmp         eax,dword ptr [until]  
    01276002  jge         main+283h (01276063h)  
        {
            ExampleArray1[1]++;
    01276004  mov         eax,4  
    01276009  shl         eax,0  
    0127600C  mov         ecx,dword ptr [ExampleArray1]  
    0127600F  mov         edx,dword ptr [ecx+eax]  
    01276012  add         edx,1  
    01276015  mov         eax,4  
    0127601A  shl         eax,0  
    0127601D  mov         ecx,dword ptr [ExampleArray1]  
    01276020  mov         dword ptr [ecx+eax],edx  
    

    在 Release模式(优化)下,第一个循环的代码比第二个循环的代码短,第二个标题在反汇编中是两倍( 这可能是罪魁祸首吗? )。第一个循环:
        for(i=0 ; i<until; i++)
    00AD10D9  xor         ecx,ecx  
    00AD10DB  mov         dword ptr [esp+24h],eax  
    00AD10DF  cmp         dword ptr [esp+10h],ecx  
    00AD10E3  jle         main+0F5h (0AD10F5h)  
        {
            ExampleArray1[1]++;
    00AD10E5  inc         dword ptr [esi+4]  
            ExampleArray2[1]++;
    00AD10E8  inc         dword ptr [ebx+4]  
            ExampleArray3[1]++;
    00AD10EB  inc         dword ptr [edi+4]  
    00AD10EE  inc         ecx  
    00AD10EF  cmp         ecx,dword ptr [esp+10h]  
    00AD10F3  jl          main+0E5h (0AD10E5h)
    

    第二个循环:
            for(i=0 ; i<until; i++)
    003B13B4  xor         ecx,ecx  
    003B13B6  mov         dword ptr [esp+24h],eax  
    003B13BA  cmp         dword ptr [esp+10h],ecx  
    003B13BE  jle         main+174h (03B13E4h)  
            for(i=0 ; i<until; i++)
    003B13C0  mov         eax,dword ptr [esp+1Ch]  
    003B13C4  mov         edx,dword ptr [esp+18h]  
    003B13C8  mov         edi,dword ptr [esp+20h]  
    003B13CC  lea         esp,[esp]  
        {
            ExampleArray4[1]++;
    003B13D0  inc         dword ptr [eax+4]  
            ExampleArray5[1]++;
    003B13D3  inc         dword ptr [edx+4]  
            ExampleArray6[1]++;
    003B13D6  inc         dword ptr [edi+4]  
    003B13D9  inc         ecx  
    003B13DA  cmp         ecx,dword ptr [esp+10h]  
    003B13DE  jl          main+160h (03B13D0h)  
    003B13E0  mov         edi,dword ptr [esp+14h]  
        }
    

    这就是没有优化的release反汇编->第一个循环:
        for(i=0 ; i<until; i++)
    001A17A2  mov         dword ptr [i],0  
    001A17A9  jmp         main+1C4h (01A17B4h)  
    001A17AB  mov         edx,dword ptr [i]  
    001A17AE  add         edx,1  
    001A17B1  mov         dword ptr [i],edx  
    001A17B4  mov         eax,dword ptr [i]  
    001A17B7  cmp         eax,dword ptr [until]  
    001A17BA  jge         main+22Bh (01A181Bh)  
        {
            ExampleArray1[1]++;
    001A17BC  mov         ecx,4  
    001A17C1  shl         ecx,0  
    001A17C4  mov         edx,dword ptr [ExampleArray1]  
    001A17C7  mov         eax,dword ptr [edx+ecx]  
    001A17CA  add         eax,1  
    001A17CD  mov         ecx,4  
    001A17D2  shl         ecx,0  
    001A17D5  mov         edx,dword ptr [ExampleArray1]  
    001A17D8  mov         dword ptr [edx+ecx],eax  
            ExampleArray2[1]++;
    001A17DB  mov         eax,4  
    001A17E0  shl         eax,0  
    001A17E3  mov         ecx,dword ptr [ExampleArray2]  
    001A17E6  mov         edx,dword ptr [ecx+eax]  
    001A17E9  add         edx,1  
    001A17EC  mov         eax,4  
    001A17F1  shl         eax,0  
    001A17F4  mov         ecx,dword ptr [ExampleArray2]  
    001A17F7  mov         dword ptr [ecx+eax],edx  
            ExampleArray3[1]++;
    001A17FA  mov         edx,4  
    001A17FF  shl         edx,0  
    001A1802  mov         eax,dword ptr [ExampleArray3]  
    001A1805  mov         ecx,dword ptr [eax+edx]  
    001A1808  add         ecx,1  
    001A180B  mov         edx,4  
    001A1810  shl         edx,0  
    001A1813  mov         eax,dword ptr [ExampleArray3]  
    001A1816  mov         dword ptr [eax+edx],ecx  
    

    第二个循环:
        for(i=0 ; i<until; i++)
    001A186F  mov         dword ptr [i],0  
    001A1876  jmp         main+291h (01A1881h)  
    001A1878  mov         eax,dword ptr [i]  
    001A187B  add         eax,1  
    001A187E  mov         dword ptr [i],eax  
    001A1881  mov         ecx,dword ptr [i]  
    001A1884  cmp         ecx,dword ptr [until]  
    001A1887  jge         main+2F8h (01A18E8h)  
        {
            ExampleArray4[1]++;
    001A1889  mov         edx,4  
    001A188E  shl         edx,0  
    001A1891  mov         eax,dword ptr [ExampleArray4]  
    001A1894  mov         ecx,dword ptr [eax+edx]  
    001A1897  add         ecx,1  
    001A189A  mov         edx,4  
    001A189F  shl         edx,0  
    001A18A2  mov         eax,dword ptr [ExampleArray4]  
        {
            ExampleArray4[1]++;
    001A18A5  mov         dword ptr [eax+edx],ecx  
            ExampleArray5[1]++;
    001A18A8  mov         ecx,4  
    001A18AD  shl         ecx,0  
    001A18B0  mov         edx,dword ptr [ExampleArray5]  
    001A18B3  mov         eax,dword ptr [edx+ecx]  
    001A18B6  add         eax,1  
    001A18B9  mov         ecx,4  
    001A18BE  shl         ecx,0  
    001A18C1  mov         edx,dword ptr [ExampleArray5]  
    001A18C4  mov         dword ptr [edx+ecx],eax  
            ExampleArray6[1]++;
    001A18C7  mov         eax,4  
    001A18CC  shl         eax,0  
    001A18CF  mov         ecx,dword ptr [ExampleArray6]  
    001A18D2  mov         edx,dword ptr [ecx+eax]  
    001A18D5  add         edx,1  
    001A18D8  mov         eax,4  
    001A18DD  shl         eax,0  
    001A18E0  mov         ecx,dword ptr [ExampleArray6]  
    001A18E3  mov         dword ptr [ecx+eax],edx  
        }
    

    反汇编 - VS 2013 (Express)

    Debug模式:-同VS 2012-

    在 Release模式下(经过优化)它看起来有点不同 ->
    第一个循环:
        for (i = 0; i<until; i++)
    01391384  xor         ecx,ecx  
    01391386  mov         dword ptr [esp+10h],eax  
    0139138A  cmp         dword ptr [esp+20h],ecx  
    0139138E  jle         main+100h (013913A0h)  
        {
            ExampleArray1[1]++;
    01391390  inc         dword ptr [esi+4]  
    01391393  inc         ecx  
            ExampleArray2[1]++;
    01391394  inc         dword ptr [ebx+4]  
            ExampleArray3[1]++;
    01391397  inc         dword ptr [edi+4]  
    0139139A  cmp         ecx,dword ptr [esp+20h]  
    0139139E  jl          main+0F0h (01391390h)  
        }
    

    第二个循环(循环标题更大?):
        for (i = 0; i<until; i++)
    013913EF  xor         ecx,ecx  
    013913F1  mov         dword ptr [esp+10h],eax  
    013913F5  cmp         dword ptr [esp+20h],ecx  
    013913F9  jle         main+17Bh (0139141Bh)  
    013913FB  mov         eax,dword ptr [esp+18h]  
    013913FF  mov         edx,dword ptr [esp+0Ch]  
    01391403  mov         edi,dword ptr [esp+1Ch]  
        {
            ExampleArray4[1]++;
    01391407  inc         dword ptr [eax+4]  
    0139140A  inc         ecx  
            ExampleArray5[1]++;
    0139140B  inc         dword ptr [edx+4]  
            ExampleArray6[1]++;
    0139140E  inc         dword ptr [edi+4]  
    01391411  cmp         ecx,dword ptr [esp+20h]  
    01391415  jl          main+167h (01391407h)  
    01391417  mov         edi,dword ptr [esp+14h]  
        }
    

    Release模式(无优化)-> 第一个循环:
        for (i = 0; i<until; i++)
    00DC182C  mov         dword ptr [i],0  
    00DC1833  jmp         main+1CEh (0DC183Eh)  
    00DC1835  mov         edx,dword ptr [i]  
    00DC1838  add         edx,1  
    00DC183B  mov         dword ptr [i],edx  
    00DC183E  mov         eax,dword ptr [i]  
    00DC1841  cmp         eax,dword ptr [until]  
    00DC1844  jge         main+235h (0DC18A5h)  
        {
            ExampleArray1[1]++;
    00DC1846  mov         ecx,4  
    00DC184B  shl         ecx,0  
    00DC184E  mov         edx,dword ptr [ExampleArray1]  
    00DC1851  mov         eax,dword ptr [edx+ecx]  
    00DC1854  add         eax,1  
    00DC1857  mov         ecx,4  
    00DC185C  shl         ecx,0  
    00DC185F  mov         edx,dword ptr [ExampleArray1]  
    00DC1862  mov         dword ptr [edx+ecx],eax  
            ExampleArray2[1]++;
    00DC1865  mov         eax,4  
    00DC186A  shl         eax,0  
    00DC186D  mov         ecx,dword ptr [ExampleArray2]  
    00DC1870  mov         edx,dword ptr [ecx+eax]  
    00DC1873  add         edx,1  
    00DC1876  mov         eax,4  
    00DC187B  shl         eax,0  
    00DC187E  mov         ecx,dword ptr [ExampleArray2]  
    00DC1881  mov         dword ptr [ecx+eax],edx  
            ExampleArray3[1]++;
    00DC1884  mov         edx,4  
    00DC1889  shl         edx,0  
    00DC188C  mov         eax,dword ptr [ExampleArray3]  
    00DC188F  mov         ecx,dword ptr [eax+edx]  
    00DC1892  add         ecx,1  
    00DC1895  mov         edx,4  
    00DC189A  shl         edx,0  
    00DC189D  mov         eax,dword ptr [ExampleArray3]  
    00DC18A0  mov         dword ptr [eax+edx],ecx  
            }
    

    第二个循环:
        for (i = 0; i<until; i++)
    00DC18F9  mov         dword ptr [i],0  
    00DC1900  jmp         main+29Bh (0DC190Bh)  
    00DC1902  mov         eax,dword ptr [i]  
    00DC1905  add         eax,1  
    00DC1908  mov         dword ptr [i],eax  
    00DC190B  mov         ecx,dword ptr [i]  
    00DC190E  cmp         ecx,dword ptr [until]  
    00DC1911  jge         main+302h (0DC1972h)  
        {
            ExampleArray4[1]++;
     00DC1913  mov         edx,4  
        {
            ExampleArray4[1]++;
    00DC1918  shl         edx,0  
    00DC191B  mov         eax,dword ptr [ExampleArray4]  
    00DC191E  mov         ecx,dword ptr [eax+edx]  
    00DC1921  add         ecx,1  
    00DC1924  mov         edx,4  
    00DC1929  shl         edx,0  
    00DC192C  mov         eax,dword ptr [ExampleArray4]  
    00DC192F  mov         dword ptr [eax+edx],ecx  
            ExampleArray5[1]++;
    00DC1932  mov         ecx,4  
    00DC1937  shl         ecx,0  
    00DC193A  mov         edx,dword ptr [ExampleArray5]  
    00DC193D  mov         eax,dword ptr [edx+ecx]  
    00DC1940  add         eax,1  
    00DC1943  mov         ecx,4  
    00DC1948  shl         ecx,0  
    00DC194B  mov         edx,dword ptr [ExampleArray5]  
    00DC194E  mov         dword ptr [edx+ecx],eax  
            ExampleArray6[1]++;
    00DC1951  mov         eax,4  
    00DC1956  shl         eax,0  
    00DC1959  mov         ecx,dword ptr [ExampleArray6]  
    00DC195C  mov         edx,dword ptr [ecx+eax]  
    00DC195F  add         edx,1  
    00DC1962  mov         eax,4  
    00DC1967  shl         eax,0  
    00DC196A  mov         ecx,dword ptr [ExampleArray6]  
    00DC196D  mov         dword ptr [ecx+eax],edx  
        }
    

    编辑:嗯,我已经尽力了。我比以前更糊涂了。要查看反汇编,我在代码中设置了一个断点并按下鼠标右键-> 转到反汇编。然后我看到了拆解。在所有这些代码中,我在“ExampleArray2[1]++”(第 34 行)处设置了断点。
    现在,我注意到如果我在另一个数组上设置断点,反汇编会发生变化。
    为什么...... Visual Studio 坏了或类似的东西还是正常的?
    这个问题已经很大了。我已经上传了时钟的拆卸和硬编码,直到 pastebin:http://pastebin.com/pxgegzZ6

    重要提示:我在 Release模式下做了一个很有帮助的发现。如果我在第二个循环中按鼠标右键并按“运行直到到达光标”或在第二个循环中设置光标并按 Ctrl+F10,那么第一个循环只需要 2.6 秒!如果我在代码末尾设置光标,第一个循环需要 2.5-2.7 秒,但第二个循环和以前一样慢。在 Debug模式下,时间不会改变。

    最佳答案

    这在我看来像是缓存问题。

    如果,而不是

    for(i=0 ; i<until; i++)
    {
        ExampleArray4[1]++;
        ExampleArray5[1]++;
        ExampleArray6[1]++;
    }
    

    你做到了
    for(i=0 ; i<until; i++) ExampleArray4[1]++;
    for(i=0 ; i<until; i++) ExampleArray5[1]++;
    for(i=0 ; i<until; i++) ExampleArray6[1]++;
    

    我预测它会快得多。

    缓存成为问题的原因是,每次从处理一个阵列切换到下一个阵列时,都必须从缓存中提取不同的位置。通过频繁切换数组,您会遇到很多缓存未命中。如果您遍历二维数组的行而不是列,则会出现类似的问题。据推测,这不会影响您的较小数组,因为它们都可以放入缓存中。

    关于c++ - 使用大数组索引增加访问时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27674788/

    有关c++ - 使用大数组索引增加访问时间的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

      我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

    3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

      很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

    5. ruby - 在 Ruby 中使用匿名模块 - 2

      假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

    6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

      我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

    7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

      我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

    10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

      我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

    随机推荐