小编Dan*_*alk的帖子

c,stdin/out中的快速I/O.

此链接指定的编码竞赛中,您需要读取大量数据stdin,进行一些计算并提供大量数据stdout.

在我的基准测试中,尽管我尽可能地尝试优化它,但几乎只有I/O才需要时间.

你输入的是一个字符串(1 <= len <= 100'000)和q行的一对int,其中q也是1 <= q <= 100'000.

我在100倍大的数据集(len = 10M,q = 10M)上对我的代码进行基准测试,这就是结果:

 Activity            time      accumulated

 Read text:          0.004     0.004
 Read numbers:       0.146     0.150
 Parse numbers:      0.200     0.350
 Calc answers:       0.001     0.351
 Format output:      0.037     0.388
 Print output:       0.143     0.531
Run Code Online (Sandbox Code Playgroud)

通过实现我自己的格式化和数字解析内联我设法将时间缩短到使用printf和时间的1/3 scanf.

然而,当我将我的解决方案上传到比赛网页时,我的解决方案需要1.88秒(我认为这是超过22个数据集的总时间).当我看到高分时,有几个实现(在c ++中)在0.05秒内完成,比我快了近40倍!怎么可能?

我想我可以通过使用2个线程来加速它,然后我可以开始计算并写入stdout,同时仍然从stdin读取.然而,这将减少min(0.150, 0.143)我的大型数据集的理论上最佳情况的时间.我仍然没有接近高分...

在下图中,您可以看到消耗时间的统计信息.

消耗时间的统计

该程序由网站编译,具有以下选项:

gcc -g -O2 -std=gnu99 -static my_file.c -lm
Run Code Online (Sandbox Code Playgroud)

和定时这样:

time ./a.out < sample.in > sample.out …
Run Code Online (Sandbox Code Playgroud)

c optimization performance stdin stdout

11
推荐指数
1
解决办法
565
查看次数

C# 使用 DTD 验证读取 XML

我正在尝试使用 dtd 验证读取 XML 文件,但不知道我是怎么做的,好像程序没有读取我的 dtd 文件。我将问题集中在一个小的 xml 文件和一个小的 dtd 文件上:

test.xml - 位于 c:\test.xml

<?xml version="1.0"?>
<!DOCTYPE Product SYSTEM "test.dtd">
<Product ProductID="123">
   <ProductName>Rugby jersey</ProductName>
</Product>
Run Code Online (Sandbox Code Playgroud)

test.dtd - 位于 c:\test.dtd

<!ELEMENT Product (ProductName)>
<!ATTLIST Product ProductID CDATA #REQUIRED>
<!ELEMENT ProductName (#PCDATA)>
Run Code Online (Sandbox Code Playgroud)

我的 C# 程序看起来像这样

namespace XML_to_csv_converter
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ReadXMLwithDTD();
        }

        public void ReadXMLwithDTD()
        {
            // Set the validation settings.
            XmlReaderSettings settings = …
Run Code Online (Sandbox Code Playgroud)

c# xml dtd

4
推荐指数
2
解决办法
7066
查看次数

将函数签名中的枚举声明为返回状态

我最近想出了一种我认为是在C代码中声明函数返回状态的奇怪方法。执行任务的功能通常会根据成功或错误返回状态代码。这通常以整数或枚举的形式发送,该枚举在文件(或另一个文件)中的其他位置声明。我发现通过在函数签名中声明枚举,我们可以:

  • 使可能的返回值接近函数签名
  • 每个函数都有一组唯一的返回值,避免使用未使用的值

例如:

// implementation.h
enum {
    OK,
    INTERNAL_ERROR,
    NO_PARAMETERS
} do_that();

// implementation.c
enum {
    OK,
    INTERNAL_ERROR,
    NO_PARAMETERS
} do_that() {
    if (this())
        return OK;
    else if (that())
        return NO_PARAMETERS;
    return INTERNAL_ERROR;
}
Run Code Online (Sandbox Code Playgroud)

我从未见过有人使用过这种风格。有效吗 如果没有,为什么不呢?

我看到的一个缺点是,您必须在c文件和头文件中都声明可能的返回值,但这也使它更可用,并且在查看签名时可以直接清除。

另一个问题是,据我了解,即使在学究的c语言中,枚举类型之间也可以进行隐式转换,这意味着在函数声明和实现(c和h文件)中声明不同的返回状态不会生成警告或错误。

c enums return-value language-lawyer

2
推荐指数
1
解决办法
106
查看次数

输出文本着色的鱼壳自定义功能

当在终端模拟器(例如终结器)中使用 Fish shell 以及输出大量文本的命令时,在输出上获取一些颜色编码可能会很有用。我知道脚本可以将颜色代码信息添加到输出中,例如“ grep --color=auto ”。我想可以修改鱼终端以扫描输出并将其添加到特殊位置吗?

我想要做的是,任何脚本的输出中出现的文本“错误”始终标记为红色,而“警告”始终标记为黄色。任何人都知道这是否可以通过在~/.config/fish/functions目录或类似目录中引入函数文件来实现?

linux shell terminal terminal-emulator fish

1
推荐指数
1
解决办法
2774
查看次数